王朝网络
分享
 
 
 

利用MVC模式开发Java应用程序

王朝java/jsp·作者佚名  2008-05-31
宽屏版  字体: |||超大  

利用MVC模式开发java应用程序

作者:◇ 龚赤兵 本文选自:开放系统世界 2003年06月06日

Java是一种面向对象的语言,是实现面向对象编程的强大工具。我们在实际编程中,应该运用并发挥其最大效能。但是,要利用面向对象编程思想,自己独立开发出好的Java应用程序,非凡是大、中型程序,并不是一件简单的事情。正是基于面向对象编程思想,人们将实际中的各种应用程序,进行了大量的分析、总结,从而归纳出许多标准的设计模式。将这些设计模式合理地运用到自己的实际项目中,可以最大限度地减少开发过程中出现的设计上的问题,确保项目高质量的如期完成。

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必须是implements Observe,另外还需实现其中的方法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运行时,将鼠标移动到球体的外圆处

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有