當柳上原的風吹向天際的時候...

          真正的快樂來源于創造

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks
          在交易系統的客戶端中,涉及的業務種類有很多,如分類,商品,詢價,協商等大類及其下的CRUD四個小類,每種操作幾乎都需要一個界面供用戶操作,這些界面及其內部處理如果安排不當會造成維護上的巨大麻煩,而且隨著程序的發展,界面表現,用戶交互和數據處理都會而變得越來越復雜,如果不在一開始就對它們進行分開處理,最后只能導致不可維護的結果,屆時悔之晚矣。只有邁出了這堅實穩固的一步,后面的成功才有可靠的保證。因此我采用了MVC2模式來將每個操作界面的界面表現,用戶交互和數據處理三部分分離,目的是為了提高系統的可維護性和可擴展性。下面是對交易系統采用的MVC2模式的簡要介紹,以便于負責業務的程序員掌握之。

          一.MVC2模式的來源
             這種模式首見于網絡程序,起初因為Model無法通知到Web程序的界面而發明.這種模式采用Controller做中介者,一方面取得View的輸入,然后交由Model層處理,之后再把返回的數據傳遞到View。在Web程序(典型例子如Struts1)中各層任務如下:View接受用戶輸入,并在并傳遞到Controller;Controller統一進行處理命令,交由Model處理具體的業務;進過處理Model更新后,Controller會選一個View并把Model內容傳遞(request,session)給它,然后View進行顯示.

          二.MVC2的優缺點
             MVC2相對MVC1優勢很明顯,首先Model和View無需繼承別的類,其次Model和View無需了解對方的存在,只需準備相應的接口而已,最主要的是,是進行了數據部分,視圖部分和控制部分三層的區分,程序的耦合度將大為降低,而可讀性和可修改性將隨之提高;缺點對于規模較小的程序或是組件,MVC2稍顯費事,有些過度設計的嫌疑。

          三.在客戶端程序中MVC各層擔負的職責

          視圖View:它擔任數據的顯示并接受用戶的輸入,其中不包括業務邏輯,但可以包含顯示邏輯。

          數據中心Model:它保存數據層和控制層所需要的數據并提供操作這些數據的方法。

          控制器Ctrl:它是一個中介者,負責實例化視圖和數據中心,由此View和Model并不需要知道對方的存在。View的事件在Ctrl中注冊,這樣當事件發生時Ctrl能調用Model取得相應的數據并顯示在View中。Ctrl中包含處理邏輯。

          下面的UML圖形可以參考:
          MVC2靜態類圖


          MVC2順序圖


          下面是最簡化的MVC三層次代碼示例:
          控制類
          public class Mvc2Ctrl {
              
          private Mvc2View view;
              
          private Mvc2Model model;
              
          public Mvc2Ctrl() {
                  view 
          = new Mvc2View();
                  model 
          = new Mvc2Model();
                  handleEvents();
              }
              
          // 處理事件響應
              private void handleEvents() {
                  addCloseLintener();
                  addButtonListener();
                  addButtonListener2();
              }
              
          // 窗體關閉事件相應
              private void addCloseLintener() {
                  view.addWindowListener(
          new WindowAdapter() {
                      
          public void windowClosing(WindowEvent e) {
                          System.out.println(
          "Exit MVC2");
                          System.exit(
          0);
                      }
                  });
              }
              
          private void addButtonListener() {
                  view.getButton().addActionListener(
          new ActionListener() {
                      
          public void actionPerformed(ActionEvent e) {
                          view.getLabel().setText(model.getText());
                      }
                  });
              }
              
              
          private void addButtonListener2() {
                  view.getButton2().addActionListener(
          new ActionListener() {
                      
          public void actionPerformed(ActionEvent e) {
                          view.getLabel2().setText(model.getText2());
                      }
                  });
              }
          }

          視圖類
          public class Mvc2View extends JFrame {
              
          private static final long serialVersionUID = 621145935910133202L;
              
          private JButton button;
              
          private JLabel label;
              
          private JButton button2;
              
          private JLabel label2;
              
          public Mvc2View() {
                  locateView(
          300200);
                  
          this.setTitle("MVC2 Program");
                  setupComponents();
                  
          this.setVisible(true);
              }
              
          // 定位程序在屏幕正中并設置程序大小
              private void locateView(int width, int height) {
                  Dimension screenSize 
          = Toolkit.getDefaultToolkit().getScreenSize();
                  
          this.setSize(width, height);
                  
          this.setLocation(screenSize.width / 2 - width / 2, screenSize.height
                          
          / 2 - height / 2);
              }
              
          // 初始化內部組件
              private void setupComponents() {
                  button 
          = new JButton("點擊響應事件1");
                  label 
          = new JLabel("  等待事件響應1");
                  button2 
          = new JButton("點擊響應事件2");
                  label2 
          = new JLabel("  等待事件響應2");
                  setLayout(
          new GridLayout(22));
                  add(button);
                  add(label);
                  add(button2);
                  add(label2);
              }
              
          public JButton getButton() {
                  
          return button;
              }
              
          public JButton getButton2() {
                  
          return button2;
              }
              
          public JLabel getLabel() {
                  
          return label;
              }
              
          public JLabel getLabel2() {
                  
          return label2;
              }
          }
          模塊類
          public class Mvc2Model{
              
          public String getText(){
                  
          return "  事件1響應完畢";
              }
              
              
          public String getText2(){
                  
          return "  事件2響應完畢";
              }
          }

          小結:
          一.越是大型程序,MVC越有必要;倒是小型程序不一定硬要遵守MVC。
          二.以上代碼抽象程度還不夠,理論上說,應該阻止程序員在界面中寫監聽代碼。
          三.三部分應該實現相應的接口,這里是應該繼續進化的地方。

          posted on 2010-05-23 13:56 何楊 閱讀(298) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 五莲县| 容城县| 北海市| 通化县| 建水县| 大石桥市| 即墨市| 台江县| 贡山| 巴彦县| 临朐县| 灵宝市| 都昌县| 双辽市| 邯郸县| 天津市| 宜川县| 菏泽市| 商都县| 盐津县| 胶州市| 安泽县| 彭山县| 当涂县| 贵阳市| 徐汇区| 揭阳市| 德令哈市| 雷波县| 紫云| 绥棱县| 汉川市| 府谷县| 东乡| 苏尼特左旗| 禄丰县| 大埔区| 博客| 容城县| 凉山| 萨迦县|