<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    sharky的點(diǎn)滴積累

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      56 隨筆 :: 104 文章 :: 10 評(píng)論 :: 0 Trackbacks
    Java是一種面向?qū)ο蟮恼Z(yǔ)言,是實(shí)現(xiàn)面向?qū)ο缶幊痰膹?qiáng)大工具。我們?cè)趯?shí)際編程中,應(yīng)該運(yùn)用并發(fā)揮其最大效能。但是,要利用面向?qū)ο缶幊趟枷耄约邯?dú)立開(kāi)發(fā)出好的Java應(yīng)用程序,特別是大、中型程序,并不是一件簡(jiǎn)單的事情。正是基于面向?qū)ο缶幊趟枷耄藗儗?shí)際中的各種應(yīng)用程序,進(jìn)行了大量的分析、總結(jié),從而歸納出許多標(biāo)準(zhǔn)的設(shè)計(jì)模式。將這些設(shè)計(jì)模式合理地運(yùn)用到自己的實(shí)際項(xiàng)目中,可以最大限度地減少開(kāi)發(fā)過(guò)程中出現(xiàn)的設(shè)計(jì)上的問(wèn)題,確保項(xiàng)目高質(zhì)量的如期完成。

      MVC模式介紹

      模型-視圖-控制器(Model-View-Controller,MVC)模式就是為那些需要為同樣的數(shù)據(jù)提供多個(gè)視圖的應(yīng)用程序而設(shè)計(jì)的。它很好地實(shí)現(xiàn)了數(shù)據(jù)層與表示層的分離,特別適用于開(kāi)發(fā)與用戶圖形界面有關(guān)的應(yīng)用程序,其示意圖見(jiàn)圖1。模式中基本結(jié)構(gòu)定義為:

      控制器 用來(lái)處理用戶命令以及程序事件的;

      模型 維護(hù)數(shù)據(jù)并提供數(shù)據(jù)訪問(wèn)方法;

      視圖 數(shù)據(jù)的顯示。

      MVC模式基本實(shí)現(xiàn)過(guò)程為:

      1. 控制器(如Java中的main程序入口)要新建模型;

      2. 控制器要新建一個(gè)或多個(gè)視圖對(duì)象,并將它們與模型相關(guān)聯(lián);

      3. 控制器改變模型的狀態(tài);

      4. 當(dāng)模型的狀態(tài)改變時(shí),模型將會(huì)自動(dòng)刷新與之相關(guān)的視圖。

      圖1 MVC模式基本結(jié)構(gòu)

      本文要實(shí)現(xiàn)的Java應(yīng)用程序是當(dāng)用戶在圖形化用戶界面輸入一個(gè)球體的半徑時(shí),程序?qū)@示該球體的體積與表面積。我們首先利用基本MVC模式實(shí)現(xiàn)以上程序,然后利用不同數(shù)量的模型、視圖、控制器結(jié)構(gòu)來(lái)擴(kuò)展該程序。

      基本MVC模式

      該程序主要由三個(gè)類構(gòu)成,分別為Sphere類、TextView類及SphereWindow類。其中Sphere類扮演Model的角色,TextView類為View角色,SphereWindow類為Controller角色。

      Java通過(guò)專門的類Observable及Observer接口來(lái)實(shí)現(xiàn)MVC編程模式。其UML類圖及MVC模式的實(shí)現(xiàn)方式見(jiàn)圖2。

      圖2 MVC模式的UML類圖

      從圖2中可以看出,Model類必須繼承Observable類,View類必須實(shí)現(xiàn)接口Observer。正是由于實(shí)現(xiàn)了上述結(jié)構(gòu),當(dāng)模型發(fā)生改變時(shí)(當(dāng)控制器改變模型的狀態(tài)),模型就會(huì)自動(dòng)刷新與之相關(guān)的視圖。其UML序列圖可以表示為圖3。

      Model類Sphere,必須擴(kuò)展Observable類,因?yàn)樵贠bservable類中,方法addObserver()將視圖與模型相關(guān)聯(lián),當(dāng)模型狀態(tài)改變時(shí),通過(guò)方法notifyObservers()通知視圖。其中實(shí)現(xiàn)MVC模式的關(guān)鍵代碼為:

    import java.util.Observable;
    class Sphere extends Observable
    {
    ....
    public void setRadius(double r)
     {
      myRadius = r;
      setChanged();         // Indicates that the model has changed
      notifyObservers();
     }
    ....
    }

      圖3 MVC模式的UML序列圖

      View類的角色TextView類必須實(shí)現(xiàn)接口Observer,這意味著類TextView必須是implements Observe,另外還需實(shí)現(xiàn)其中的方法update()。有了這個(gè)方法,當(dāng)模型Sphere類的狀態(tài)發(fā)生改變時(shí),與模型相關(guān)聯(lián)的視圖中的update()方法就會(huì)自動(dòng)被調(diào)用,從而實(shí)現(xiàn)視圖的自動(dòng)刷新。View類的關(guān)鍵代碼如下:

    import java.util.Observer;
    import java.util.Observable;
    public class TextView extends JPanel implements Observer
    {
    ......
     public void update(Observable o, Object arg)
     {
      Sphere balloon = (Sphere)o; 
      radiusIn.setText(“ ”+f3.format(balloon.getRadius()));
      volumeOut.setText(“ ”+f3.format(balloon.volume()));
      surfAreaOut.setText(“ ” + f3.format(balloon.surfaceArea()));
     }
    ......
    }

      SphereWindow類作為Controller,它主要新建Model與View,將view與Model相關(guān)聯(lián),并處理事件,其中的關(guān)鍵代碼為:

    public SphereWindow()
    {
     super(“Spheres: volume and surface area”);
     model = new Sphere(0, 0, 100);
     TextView view = new TextView();
     model.addObserver(view);
     view.update(model, null);
     view.addActionListener(this);
     Container c = getContentPane();
     c.add(view);
    }
    public void actionPerformed(ActionEvent e)
    {
     JTextField t = (JTextField)e.getSource();    
     double r = Double.parseDouble(t.getText());
     model.setRadius(r);
    }

      該程序是通過(guò)Java中的MVC模式編寫的,具有極其良好的可擴(kuò)展性。它可以輕松實(shí)現(xiàn)以下功能:

      1. 實(shí)現(xiàn)一個(gè)模型的多個(gè)視圖;

      2. 采用多個(gè)控制器;

      3. 當(dāng)模型改變時(shí),所有視圖將自動(dòng)刷新;

      4. 所有的控制器將相互獨(dú)立工作。

      這就是Java編程模式的好處,只需在以前的程序上稍作修改或增加新的類,即可輕松增加許多程序功能。以前開(kāi)發(fā)的許多類可以重用,而程序結(jié)構(gòu)根本不再需要改變,各類之間相互獨(dú)立,便于團(tuán)體開(kāi)發(fā),提高開(kāi)發(fā)效率。

      一個(gè)模型、兩個(gè)視圖和一個(gè)控制器

      下面我們討論如何實(shí)現(xiàn)一個(gè)模型、兩個(gè)視圖和一個(gè)控制器的程序。當(dāng)用戶在圖形化用戶界面輸入一個(gè)球體的半徑,程序除顯示該球體的體積與表面積外,還將圖形化顯示該球體。該程序的4個(gè)類之間的示意圖可見(jiàn)圖4。

      圖4一個(gè)模型、兩個(gè)視圖和一個(gè)控制器的基本結(jié)構(gòu)

      其中Model類及View1類根本不需要改變,與前面的完全一樣,這就是面向?qū)ο缶幊痰暮锰帯?duì)于Controller中的SphereWindows類,只需要增加另一個(gè)視圖,并與Model發(fā)生關(guān)聯(lián)即可。其關(guān)鍵實(shí)現(xiàn)代碼為:

    public SphereWindow()
      {
       super(“Spheres: volume and surface area”);
       model = new Sphere(0, 0, 100);
       TextView tView = new TextView();
       model.addObserver(tView);
       tView.addActionListener(this);
       tView.update(model, null);
       GraphicsView gView = new GraphicsView();
       model.addObserver(gView);
       gView.update(model, null);
       Container c = getContentPane();
       c.setLayout(new GridLayout(1, 2));
       c.add(tView);
       c.add(gView);
      }

      其程序輸出結(jié)果見(jiàn)圖5。

      圖5 輸出結(jié)果

      一個(gè)模型、兩個(gè)視圖和兩個(gè)控制器

      在上面的程序中,我們只能通過(guò)鍵盤輸入球體半徑,現(xiàn)在我們修改以上程序,利用鼠標(biāo)放大、縮小右邊的球體圖形及可改變球體的半徑,從而獲得球體半徑的輸入。

      此時(shí)的MCV模式為一個(gè)模型、兩個(gè)視圖和兩個(gè)控制器,其結(jié)構(gòu)可以見(jiàn)圖6,其UML類圖可以表示為圖7。

      其中Sphere、TextView與GraphicsView類與前面完全一樣。在主程序SphereWindows中,該類這時(shí)不是直接作為Controller,它控制Controller1與Controller2的新建。該程序的關(guān)鍵代碼為:

    public SphereWindow()
      {
       super(“Spheres: volume and surface area”);
       Sphere model = new Sphere(0, 0, 100);
       TextController tController = new TextController(model);
       GraphicsController gController = new GraphicsController(model);
       Container c = getContentPane();
       c.setLayout(new GridLayout(1, 2));
       c.add(tController.getView());
       c.add(gController.getView());
      }

    圖6一個(gè)模型、兩個(gè)視圖和兩個(gè)控制器的基本結(jié)構(gòu)

      圖7 一個(gè)模型、兩個(gè)視圖和兩個(gè)控制器的UML類圖

      當(dāng)程序SphereWindow運(yùn)行時(shí),將鼠標(biāo)移動(dòng)到球體的外圓處,點(diǎn)擊拖動(dòng)即可實(shí)現(xiàn)球體的放大與縮小,同時(shí)球體半徑、表面積與球體積也同時(shí)變化。

      小結(jié)

      從上面介紹可以看出,通過(guò)MVC模式實(shí)現(xiàn)與圖形用戶化界面相關(guān)的應(yīng)用程序具有極其良好的可擴(kuò)展性,是Java面向?qū)ο缶幊痰奈磥?lái)方向。

    posted on 2005-09-30 18:32 sharky的點(diǎn)滴積累 閱讀(132) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 乱爱性全过程免费视频| 亚洲另类无码专区丝袜| 亚洲av无码不卡久久| 日韩欧美亚洲国产精品字幕久久久| 美女无遮挡免费视频网站| 黄色网址免费在线观看| 最近2018中文字幕免费视频| 性做久久久久久免费观看| 免费一看一级毛片人| 亚洲国产精品无码AAA片| 亚洲国产成人精品久久| 亚洲AV无码成人网站在线观看 | 深夜福利在线视频免费| 免费视频一区二区| 一二三四免费观看在线电影| 全亚洲最新黄色特级网站 | 一个人免费视频在线观看www | 久久久久免费看黄A片APP| 国产一级特黄高清免费大片| 亚洲精品国产成人片| 亚洲香蕉在线观看| 一个人看的免费视频www在线高清动漫 | 视频一区二区三区免费观看| 久久精品国产影库免费看| 最近最新中文字幕完整版免费高清| 亚洲精品无码成人片在线观看 | 亚洲一区二区三区在线播放| 久久亚洲sm情趣捆绑调教| 直接进入免费看黄的网站| 日本免费一区二区三区| 最新69国产成人精品免费视频动漫| 国产AV无码专区亚洲AV漫画| 亚洲欧洲日韩国产一区二区三区| 国产精品99爱免费视频| 日韩精品成人无码专区免费| 亚洲成AV人片在线观看WWW| 国产亚洲一卡2卡3卡4卡新区 | 久久久久久国产精品免费无码| 国产在线ts人妖免费视频| 色婷婷亚洲十月十月色天| 男女啪啪免费体验区|