利用MVC模式开发Java应用程序(转自网络,作者龚赤兵)
来源:互联网 发布:mpv player mac 安装 编辑:程序博客网 时间:2024/05/21 21:42
MVC模式介绍
模型-视图-控制器(Model-View-Controller,MVC)模式就是为那些需要为同样的数据提供多个视图的应用程序而设计的。它很好地实现了数据层与表示层的分离,特别适用于开发与用户图形界面有关的应用程序,其示意图见图1。模式中基本结构定义为:
控制器 用来处理用户命令以及程序事件的;
模型 维护数据并提供数据访问方法;
视图 数据的显示。
MVC模式基本实现过程为:
1. 控制器(如Java中的main程序入口)要新建模型;
2. 控制器要新建一个或多个视图对象,并将它们与模型相关联;
3. 控制器改变模型的状态;
4. 当模型的状态改变时,模型将会自动刷新与之相关的视图。
图1 MVC模式基本结构
本文要实现的Java应用程序是当用户在图形化用户界面输入一个球体的半径时,程序将显示该球体的体积与表面积。我们首先利用基本MVC模式实现以上程序,然后利用不同数量的模型、视图、控制器结构来扩展该程序。
基本MVC模式
该程序主要由三个类构成,分别为Sphere类、TextView类及SphereWindow类。其中Sphere类扮演Model的角色,TextView类为View角色,SphereWindow类为Controller角色。
Java通过专门的类Observable及Observer接口来实现MVC编程模式。其UML类图及MVC模式的实现方式见图2。
图2 MVC模式的UML类图
从图2中可以看出,Model类必须继承Observable类,View类必须实现接口Observer。正是由于实现了上述结构,当模型发生改变时(当控制器改变模型的状态),模型就会自动刷新与之相关的视图。其UML序列图可以表示为图3。
Model类Sphere,必须扩展Observable类,因为在Observable类中,方法addObserver()将视图与模型相关联,当模型状态改变时,通过方法notifyObservers()通知视图。其中实现MVC模式的关键代码为:
import java.util.Observable;
class Sphere extends Observable
{
....
public void setRadius(double r)
{
myRadius = r;
setChanged(); // Indicates that the model has changed
notifyObservers();
}
....
}
图3 MVC模式的UML序列图
View类的角色TextView类必须实现接口Observer,这意味着类TextView必须是implementsObserve,另外还需实现其中的方法update()。有了这个方法,当模型Sphere类的状态发生改变时,与模型相关联的视图中的update()方法就会自动被调用,从而实现视图的自动刷新。View类的关键代码如下:
import java.util.Observer;
import java.util.Observable;
public class TextView extends JPanel implements Observer
{
......
public void update(Observable o, Object arg)
{
Sphere balloon = (Sphere)o;
radiusIn.setText(“ ”+f3.format(balloon.getRadius()));
volumeOut.setText(“ ”+f3.format(balloon.volume()));
surfAreaOut.setText(“ ” + f3.format(balloon.surfaceArea()));
}
......
}
SphereWindow类作为Controller,它主要新建Model与View,将view与Model相关联,并处理事件,其中的关键代码为:
public SphereWindow()
{
super(“Spheres: volume and surface area”);
model = new Sphere(0, 0, 100);
TextView view = new TextView();
model.addObserver(view);
view.update(model, null);
view.addActionListener(this);
Container c = getContentPane();
c.add(view);
}
public void actionPerformed(ActionEvent e)
{
JTextField t = (JTextField)e.getSource();
double r = Double.parseDouble(t.getText());
model.setRadius(r);
}
该程序是通过Java中的MVC模式编写的,具有极其良好的可扩展性。它可以轻松实现以下功能:
1. 实现一个模型的多个视图;
2. 采用多个控制器;
3. 当模型改变时,所有视图将自动刷新;
4. 所有的控制器将相互独立工作。
这就是Java编程模式的好处,只需在以前的程序上稍作修改或增加新的类,即可轻松增加许多程序功能。以前开发的许多类可以重用,而程序结构根本不再需要改变,各类之间相互独立,便于团体开发,提高开发效率。
一个模型、两个视图和一个控制器
下面我们讨论如何实现一个模型、两个视图和一个控制器的程序。当用户在图形化用户界面输入一个球体的半径,程序除显示该球体的体积与表面积外,还将图形化显示该球体。该程序的4个类之间的示意图可见图4。
图4一个模型、两个视图和一个控制器的基本结构
其中Model类及View1类根本不需要改变,与前面的完全一样,这就是面向对象编程的好处。对于Controller中的SphereWindows类,只需要增加另一个视图,并与Model发生关联即可。其关键实现代码为:
public SphereWindow()
{
super(“Spheres: volume and surface area”);
model = new Sphere(0, 0, 100);
TextView tView = new TextView();
model.addObserver(tView);
tView.addActionListener(this);
tView.update(model, null);
GraphicsView gView = new GraphicsView();
model.addObserver(gView);
gView.update(model, null);
Container c = getContentPane();
c.setLayout(new GridLayout(1, 2));
c.add(tView);
c.add(gView);
}
其程序输出结果见图5。
图5 输出结果
一个模型、两个视图和两个控制器
在上面的程序中,我们只能通过键盘输入球体半径,现在我们修改以上程序,利用鼠标放大、缩小右边的球体图形及可改变球体的半径,从而获得球体半径的输入。
此时的MCV模式为一个模型、两个视图和两个控制器,其结构可以见图6,其UML类图可以表示为图7。
其中Sphere、TextView与GraphicsView类与前面完全一样。在主程序SphereWindows中,该类这时不是直接作为Controller,它控制Controller1与Controller2的新建。该程序的关键代码为:
public SphereWindow()
{
super(“Spheres: volume and surface area”);
Sphere model = new Sphere(0, 0, 100);
TextController tController = new TextController(model);
GraphicsController gController = new GraphicsController(model);
Container c = getContentPane();
c.setLayout(new GridLayout(1, 2));
c.add(tController.getView());
c.add(gController.getView());
}
图6一个模型、两个视图和两个控制器的基本结构
图7 一个模型、两个视图和两个控制器的UML类图
当程序SphereWindow运行时,将鼠标移动到球体的外圆处,点击拖动即可实现球体的放大与缩小,同时球体半径、表面积与球体积也同时变化。
小结
从上面介绍可以看出,通过MVC模式实现与图形用户化界面相关的应用程序具有极其良好的可扩展性,是Java面向对象编程的未来方向。
- 利用MVC模式开发Java应用程序(转自网络,作者龚赤兵)
- 利用MVC模式开发Java应用程序(转自网络,作者龚赤兵)
- 利用MVC模式开发Java应用程序(作者龚赤兵)
- 利用MVC模式开发Java应用程序
- 利用MVC模式开发Java应用程序
- 利用MVC模式开发Java应用程序
- 利用MVC模式开发Java应用程序
- 利用MVC模式开发Java应用程序
- 利用MVC模式开发Java应用程序
- 集成Struts MVC模式开发的应用程序
- 利用Microsoft InterDev开发网络应用程序
- 如何网络成瘾 - 作者:貘貘(转自GameRes论坛)
- Java与MVC模式开发
- java web mvc开发模式
- 利用免费软件快速启动 Java 应用程序开发
- Android开发—重构BMI应用程序—MVC模式
- 【转自网络】利用Vim配置完美的Python开发环境
- Java中利用JMF编写摄像头拍照程序(转自:天极开发者网络)
- Microsoft JDBC "ResultSet Can Not Re-Read Row Data" Error
- 商业网站——泷泽地产网站
- 过于清醒
- 利用winrar自动备份重要资料
- 找寻古老情怀
- 利用MVC模式开发Java应用程序(转自网络,作者龚赤兵)
- 免费背后真相:开源软件破坏软件业发展?
- 如何用pb得到主机的公网ip?
- 要三周完成工作流引擎的设计
- 资料:完全用Linux工作(作者:王垠)
- 对最近笔记本电脑的一些看法
- 拒绝baidu---“baidu更懂中文”广告片观后感
- 关于IFRAME 自适应高度的研究
- 总结四个这几天遇到的知识点