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

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

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

    mvc 架構(gòu)

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      74 Posts :: 60 Stories :: 5 Comments :: 0 Trackbacks
    posted on 2007-11-05 20:58 e全 閱讀(316) 評論(0)  編輯  收藏

    一般來說,可以把系統(tǒng)粗略的分為三個層次,視圖層,簡稱為View,它負責數(shù)據(jù)的輸出和輸入;業(yè)務(wù)層,簡稱為Model,它代表程序的實際業(yè)務(wù);控制層,簡稱為Controller,處理界面的相應并調(diào)用業(yè)務(wù)層進行處理,有時把ViewController兩層合稱為UI層。

    在程序發(fā)展的歷史上,MVC模式進過了多次演化,MVC1MVC2是兩種比較典型的模式,它們的區(qū)別主要在于ViewModel的聯(lián)系方式上。

    1 MVC1 模式

    這種模式主要用于桌面程序,使用觀察者模式實現(xiàn),具體來說就是讓View充當觀察者來觀察Model的變化,而用戶交互控制的地方用匿名類的方式統(tǒng)一放在controller.

    View接受用戶輸入,并將交互數(shù)據(jù)傳遞到Controller.

    Controller統(tǒng)一進行處理命令,交由Model處理具體的業(yè)務(wù).

    進過處理Model更新后,通知View進行更新.

    這種模式在舊的桌面應用程序使用較多,但是它的Model必須繼承Observable類,View必須實現(xiàn)Observer接口,人為加大了繼承體系的復雜度;而且Model通知View的方式使View必須了解Model的結(jié)構(gòu),無謂的加大了兩個類的耦合程度。這些缺點使這種模式逐漸淡出了程序舞臺。





    代碼如下:
    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();
    ????}


    ????
    // ?窗體關(guān)閉事件相應
    ???? 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(
    300 ,? 200 );
    ????????
    this .setTitle( " MVC1?Program " );
    ????????setupComponents();
    ????????
    this .setVisible( true );
    ????}


    ????
    // ?當模塊更新時,此函數(shù)會被調(diào)用
    ???? 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());
    ????????}

    ????}


    ????
    // ?定位程序在屏幕正中并設(shè)置程序大小
    ???? 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 );
    ????}


    ????
    // ?初始化內(nèi)部組件
    ???? private ? void ?setupComponents()? {
    ????????button?
    = ? new ?JButton( " 點擊響應事件1 " );
    ????????label?
    = ? new ?JLabel( " ??等待事件響應1 " );

    ????????button2?
    = ? new ?JButton( " 點擊響應事件2 " );
    ????????label2?
    = ? new ?JLabel( " ??等待事件響應2 " );

    ????????setLayout(
    new ?GridLayout( 2 ,? 2 ));
    ????????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更新,此函數(shù)被調(diào)用后View的update函數(shù)會被調(diào)用
    ???? 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;
    ????}

    }

    更新狀態(tài)輔助類:

    package ?com.sitinspring;

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

    MVC1示例代碼下載:
    http://m.tkk7.com/Files/sitinspring/MVC1.rar

    2MVC2模式

    這種模式首見于網(wǎng)絡(luò)程序,起初因為Model無法通知到Web程序的界面而發(fā)明,這種模式采用Controller做中介者,一方面取得View的輸入,然后交由Model層處理,之后再把返回的數(shù)據(jù)傳遞到View

    View接受用戶輸入,并傳遞到Controller.

    Controller統(tǒng)一進行處理命令,交由Model處理具體的業(yè)務(wù).

    進過處理Model更新后,Controller會選一個View并把Model內(nèi)容傳遞(request,session)給它(forward).

    然后View進行顯示.

    這種模式相對 MVC 優(yōu)勢很明顯,首先 Model View 無需繼承甚么東西,其次 Model View 無需了解對方的存在,只需準備相應的接口而已;缺點是 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();
    ????}


    ????
    // ?窗體關(guān)閉事件相應
    ???? 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(
    300,?200);
    ????????
    this.setTitle("MVC2?Program");
    ????????setupComponents();
    ????????
    this.setVisible(true);
    ????}


    ????
    //?定位程序在屏幕正中并設(shè)置程序大小
    ????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);
    ????}


    ????
    //?初始化內(nèi)部組件
    ????private?void?setupComponents()?{
    ????????button?
    =?new?JButton("點擊響應事件1");
    ????????label?
    =?new?JLabel("??等待事件響應1");

    ????????button2?
    =?new?JButton("點擊響應事件2");
    ????????label2?
    =?new?JLabel("??等待事件響應2");

    ????????setLayout(
    new?GridLayout(2,?2));
    ????????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://m.tkk7.com/Files/sitinspring/MVC2.rar

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


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 九九综合VA免费看| 亚洲成人网在线观看| 亚洲Av无码国产情品久久 | 亚洲国产精品成人综合色在线| 亚洲欧洲日本精品| 亚洲人成在线免费观看| 亚洲影视一区二区| 亚洲中文无码mv| 亚洲精品无码不卡在线播放| 亚洲人成色777777老人头| 欧美亚洲精品一区二区| 无人视频在线观看免费播放影院| 杨幂最新免费特级毛片| 亚欧乱色国产精品免费视频| 三级黄色片免费看| 久久免费的精品国产V∧| 国产大片91精品免费观看不卡| av无码久久久久不卡免费网站| 在线观看免费高清视频| 色www永久免费视频| 免费在线视频一区| 亚洲色欲久久久综合网| 亚洲综合一区二区国产精品| 中文字幕亚洲综合小综合在线| 久久亚洲中文无码咪咪爱| caoporm碰最新免费公开视频| 视频免费在线观看| 亚洲一级毛片免费看| 拍拍拍又黄又爽无挡视频免费| 国产在线不卡免费播放| 久久99亚洲综合精品首页| 亚洲欧洲第一a在线观看| 亚洲看片无码在线视频 | 午夜亚洲AV日韩AV无码大全| 亚洲第一香蕉视频| 亚洲成av人无码亚洲成av人| eeuss影院ss奇兵免费com| 4虎1515hh永久免费| 国外成人免费高清激情视频| 4338×亚洲全国最大色成网站| 噜噜噜亚洲色成人网站∨|