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;

/**
*控制类
*
*
@authorsitinspring(junglesong@gmail.com)
*
*@date2007-11-5
*/

public class Mvc1Ctrl {
privateMvc1Viewview;

privateMvc1Modelmodel;

publicMvc1Ctrl(){
view
=newMvc1View();
model
=newMvc1Model();
model.addObserver(view);
handleEvents();
}


//处理事件响应
privatevoidhandleEvents(){
addCloseLintener();
addButtonListener();
addButtonListener2();
}


//窗体关闭事件相应
privatevoidaddCloseLintener(){
view.addWindowListener(
newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.out.println(
"ExitMVC1");
System.exit(
0);
}

}
);
}


privatevoidaddButtonListener(){
view.getButton().addActionListener(
newActionListener(){
publicvoidactionPerformed(ActionEvente){
model.showText();
}

}
);
}


privatevoidaddButtonListener2(){
view.getButton2().addActionListener(
newActionListener(){
publicvoidactionPerformed(ActionEvente){
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)
*
*
@authorsitinspring(junglesong@gmail.com)
*
*@date2007-11-5
*/

public class Mvc1View extends JFrame implements Observer {
privatestaticfinallongserialVersionUID=621145935910133202L;

privateJButtonbutton;

privateJLabellabel;

privateJButtonbutton2;

privateJLabellabel2;

publicMvc1View(){
locateView(
300,200);
this.setTitle("MVC1Program");
setupComponents();
this.setVisible(true);
}


//当模块更新时,此函数会被调用
publicvoidupdate(Observableo,Objectarg){
Mvc1Modelmodel
=(Mvc1Model)o;

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

}


//定位程序在屏幕正中并设置程序大小
privatevoidlocateView(intwidth,intheight){
DimensionscreenSize
=Toolkit.getDefaultToolkit().getScreenSize();
this.setSize(width,height);
this.setLocation(screenSize.width/2-width/2,screenSize.height
/2-height/2);
}


//初始化内部组件
privatevoidsetupComponents(){
button
=newJButton("点击响应事件1");
label
=newJLabel("等待事件响应1");

button2
=newJButton("点击响应事件2");
label2
=newJLabel("等待事件响应2");

setLayout(
newGridLayout(2,2));
add(button);
add(label);

add(button2);
add(label2);
}


publicJButtongetButton(){
returnbutton;
}


publicJButtongetButton2(){
returnbutton2;
}

}

模块类:

package com.sitinspring;

import java.util.Observable;

/**
*模块类
*
@authorsitinspring(junglesong@gmail.com)
*
*@date2007-11-5
*/

public class Mvc1Model extends Observable {
privateStringresponseText;
privateStringupdateState;

//用于通知View更新,此函数被调用后View的update函数会被调用
privatevoidnotifyView(){
setChanged();
notifyObservers();
}


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


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


publicStringgetResponseText(){
returnresponseText;
}


publicStringgetUpdateState(){
returnupdateState;
}

}

更新状态辅助类:

package com.sitinspring;

public class Mvc1UpdateState {
publicstaticfinalStringUpdateLabel="updateLabel";
publicstaticfinalStringUpdateLabel2="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;

/**
*控制类
*
*
@authorsitinspring(junglesong@gmail.com)
*
*@date2007-11-5
*/
public class Mvc2Ctrl {
privateMvc2Viewview;

privateMvc2Modelmodel;

publicMvc2Ctrl(){
view
=newMvc2View();
model
=newMvc2Model();
handleEvents();
}


//处理事件响应
privatevoidhandleEvents(){
addCloseLintener();
addButtonListener();
addButtonListener2();
}


//窗体关闭事件相应
privatevoidaddCloseLintener(){
view.addWindowListener(
newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.out.println(
"ExitMVC2");
System.exit(
0);
}

}
);
}


privatevoidaddButtonListener(){
view.getButton().addActionListener(
newActionListener(){
publicvoidactionPerformed(ActionEvente){
view.getLabel().setText(model.getText());
}

}
);
}


privatevoidaddButtonListener2(){
view.getButton2().addActionListener(
newActionListener(){
publicvoidactionPerformed(ActionEvente){
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)
*
*
@authorsitinspring(junglesong@gmail.com)
*
*@date2007-11-5
*/

public class Mvc2View extends JFrame {
privatestaticfinallongserialVersionUID=621145935910133202L;

privateJButtonbutton;

privateJLabellabel;

privateJButtonbutton2;

privateJLabellabel2;

publicMvc2View(){
locateView(
300,200);
this.setTitle("MVC2Program");
setupComponents();
this.setVisible(true);
}


//定位程序在屏幕正中并设置程序大小
privatevoidlocateView(intwidth,intheight){
DimensionscreenSize
=Toolkit.getDefaultToolkit().getScreenSize();
this.setSize(width,height);
this.setLocation(screenSize.width/2-width/2,screenSize.height
/2-height/2);
}


//初始化内部组件
privatevoidsetupComponents(){
button
=newJButton("点击响应事件1");
label
=newJLabel("等待事件响应1");

button2
=newJButton("点击响应事件2");
label2
=newJLabel("等待事件响应2");

setLayout(
newGridLayout(2,2));
add(button);
add(label);

add(button2);
add(label2);
}


publicJButtongetButton(){
returnbutton;
}


publicJButtongetButton2(){
returnbutton2;
}


publicJLabelgetLabel(){
returnlabel;
}


publicJLabelgetLabel2(){
returnlabel2;
}

}

模块类:

package com.sitinspring;

/**
*模块类
*
@authorsitinspring(junglesong@gmail.com)
*
*@date2007-11-5
*/

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


publicStringgetText2(){
return"事件2响应完毕";
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值