zoukankan      html  css  js  c++  java
  • MVC1,MVC2简析

    一般来说,可以把系统粗略的分为三个层次,视图层,简称为View,它负责数据的输出和输入;业务层,简称为Model,它代表程序的实际业务;控制层,简称为Controller,处理界面的相应并调用业务层进行处理,有时把ViewController两层合称为UI层。

    在程序发展的历史上,MVC模式进过了多次演化,MVC1MVC2是两种比较典型的模式,它们的区别主要在于ViewModel的联系方式上。

    1 MVC1模式

    这种模式主要用于桌面程序,使用观察者模式实现,具体来说就是让View充当观察者来观察Model的变化,而用户交互控制的地方用匿名类的方式统一放在controller.

    View接受用户输入,并将交互数据传递到Controller.

    Controller统一进行处理命令,交由Model处理具体的业务.

    进过处理Model更新后,通知View进行更新.

    这种模式在旧的桌面应用程序使用较多,但是它的Model必须继承Observable类,View必须实现Observer接口,人为加大了继承体系的复杂度;而且Model通知View的方式使View必须了解Model的结构,无谓的加大了两个类的耦合程度。这些缺点使这种模式逐渐淡出了程序舞台。





    代码如下:
    Control类:

    package com.sitinspring;

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;

    /**
     * 控制类
     * 
     * 
    @author sitinspring(junglesong@gmail.com)
     * 
     * @date 2007-11-5
     
    */

    public class Mvc1Ctrl {
        
    private Mvc1View view;

        
    private Mvc1Model model;

        
    public Mvc1Ctrl() {
            view 
    = new Mvc1View();
            model 
    = new Mvc1Model();
            model.addObserver(view);
            handleEvents();
        }


        
    // 处理事件响应
        private void handleEvents() {
            addCloseLintener();
            addButtonListener();
            addButtonListener2();
        }


        
    // 窗体关闭事件相应
        private void addCloseLintener() {
            view.addWindowListener(
    new WindowAdapter() {
                
    public void windowClosing(WindowEvent e) {
                    System.out.println(
    "Exit MVC1");
                    System.exit(
    0);
                }

            }
    );
        }


        
    private void addButtonListener() {
            view.getButton().addActionListener(
    new ActionListener() {
                
    public void actionPerformed(ActionEvent e) {
                    model.showText();
                }

            }
    );
        }

        
        
    private void addButtonListener2() {
            view.getButton2().addActionListener(
    new ActionListener() {
                
    public void actionPerformed(ActionEvent e) {
                    model.showText2();
                }

            }
    );
        }

    }

    视图类(View):

    package com.sitinspring;

    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.Toolkit;
    import java.util.Observable;
    import java.util.Observer;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;

    /**
     * 视图类(View)
     * 
     * 
    @author sitinspring(junglesong@gmail.com)
     * 
     * @date 2007-11-5
     
    */

    public class Mvc1View extends JFrame implements Observer {
        
    private static final long serialVersionUID = 621145935910133202L;

        
    private JButton button;

        
    private JLabel label;

        
    private JButton button2;

        
    private JLabel label2;

        
    public Mvc1View() {
            locateView(
    300200);
            
    this.setTitle("MVC1 Program");
            setupComponents();
            
    this.setVisible(true);
        }


        
    // 当模块更新时,此函数会被调用
        public void update(Observable o, Object arg) {
            Mvc1Model model 
    = (Mvc1Model) o;

            
    if (model.getUpdateState().equals(Mvc1UpdateState.UpdateLabel)) {
                label.setText(model.getResponseText());
            }
     else if (model.getUpdateState().equals(Mvc1UpdateState.UpdateLabel2)) {
                label2.setText(model.getResponseText());
            }

        }


        
    // 定位程序在屏幕正中并设置程序大小
        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;
        }

    }

    模块类:

    package com.sitinspring;

    import java.util.Observable;

    /**
     * 模块类
     * 
    @author sitinspring(junglesong@gmail.com)
     *
     * @date 2007-11-5
     
    */

    public class Mvc1Model extends Observable{
        
    private String responseText;
        
    private String updateState;
        
        
    // 用于通知View更新,此函数被调用后View的update函数会被调用
        private void notifyView(){
            setChanged();         
            notifyObservers();
        }

        
        
    public void showText(){
            updateState
    =Mvc1UpdateState.UpdateLabel;
            responseText
    ="  事件1响应完毕";
            notifyView();
        }

        
        
    public void showText2(){
            updateState
    =Mvc1UpdateState.UpdateLabel2;
            responseText
    ="  事件2响应完毕";
            notifyView();
        }


        
    public String getResponseText() {
            
    return responseText;
        }


        
    public String getUpdateState() {
            
    return updateState;
        }

    }

    更新状态辅助类:

    package com.sitinspring;

    public class Mvc1UpdateState{
        
    public static final String UpdateLabel="updateLabel";
        
    public static final String UpdateLabel2="updateLabel2";
    }

    MVC1示例代码下载:
    http://www.blogjava.net/Files/sitinspring/MVC1.rar

    2MVC2模式

    这种模式首见于网络程序,起初因为Model无法通知到Web程序的界面而发明,这种模式采用Controller做中介者,一方面取得View的输入,然后交由Model层处理,之后再把返回的数据传递到View

    View接受用户输入,并传递到Controller.

    Controller统一进行处理命令,交由Model处理具体的业务.

    进过处理Model更新后,Controller会选一个View并把Model内容传递(request,session)给它(forward).

    然后View进行显示.

    这种模式相对MVC优势很明显,首先ModelView无需继承甚么东西,其次ModelView无需了解对方的存在,只需准备相应的接口而已;缺点是Controller层变得相对复杂了。




    代码如下:
    控制类:

    package com.sitinspring;

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;

    /**
     * 控制类
     * 
     * 
    @author sitinspring(junglesong@gmail.com)
     * 
     * @date 2007-11-5
     
    */

    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());
                }

            }
    );
        }

    }

    视图类:
    package com.sitinspring;

    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.Toolkit;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;

    /**
     * 视图类(View)
     * 
     * 
    @author sitinspring(junglesong@gmail.com)
     * 
     * @date 2007-11-5
     
    */

    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;
        }

    }

    模块类:
    package com.sitinspring;

    /**
     * 模块类
     * 
    @author sitinspring(junglesong@gmail.com)
     *
     * @date 2007-11-5
     
    */

    public class Mvc2Model{
        
    public String getText(){
            
    return "  事件1响应完毕";
        }

        
        
    public String getText2(){
            
    return "  事件2响应完毕";
        }

    }

    MVC2示例代码下载:
    http://www.blogjava.net/Files/sitinspring/MVC2.rar
  • 相关阅读:
    CentOS6.3升级GCC到GCC4.8.2
    监督式学习 -- 分类决策树(一)
    DICOM医学图像处理:fo-dicom网络传输之 C-Echo and C-Store
    百度地图----->地图类型、定位模式、实时交通、我的位置、加入覆盖物、覆盖物详情及提示
    "浪潮杯"第六届ACM山东省省赛山科场总结
    标题栏风格设置
    ActionBarActivity设置全屏无标题
    王立平--自己定义TitleBar
    C++ const限定符
    黑马day14 过滤器概述&生命周期&运行过程
  • 原文地址:https://www.cnblogs.com/sunwei2012/p/1674391.html
Copyright © 2011-2022 走看看