当柳上原的风吹向天际的时候...

真正的快乐来源于创造

  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 何杨 阅读(294) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: