〖 作者:leequn1984 〗〖 大小:30k 〗〖 发布日期:2005-12-16 〗〖 浏览:98 〗 | |||||
程序要求的功能: 1.输入球(Sphere)的半径(Radius)、体积(Volume)、表面积(Surface area)任意一个属性的值,其它两个属性的值相应改变,同时右边球体形状也相应变化 2.利用鼠标拖拽(包括点击)可随意实现球体形状大小,同时左边球体三属性的值相应变化 实现的过程: 请看程序的MVC结构 细心的朋友会发现我没有按原作者那样利用两个控制器(Controller)去实现,在这里采用的是一个控制器,一个模型(Model),两个视图(View)。这个图转换成文字便是: 1.控制器SphereWindow类创建一个模型类Sphere,两个视图类TextView和GraphicsView(见图中由SphereWindow类出发的三个箭头指向) 2.当控制器改变模型的状态时,模型自动刷新与之相关的视图(对应图中间的三个箭头) 设计思路: 1.Sphere类存放着球体三个属性的值,并提供了对他们的操作方法(set&get),由于是模型类,需要继承Observable类,注意,在set值时必须加上setChanged(); notifyObservers();两条语句以通知视图,我发生变化了,与我关联的视图也要做相应地变化。 2.视图类必须实现Observer接口,模型在变化后调用的是你在视图里写的update()方法。 视图具体是如何变化的呢?计算机处理的是数据,视图变化其实是因为影响他们的数据在化,而这数据从哪来呢,不就是从模型里取(调用get()方法)吗?而模型的set()方法如何调用?很显然需要控制器去实现,一般控制器就是包含main()方法的主程序。 3.为实现程序的交互性,在控制器程序SphereWindow里添加事件处理以能够随时set模型中数据的值。这里需要注意的是,为完全满足程序的功能,设计时务必注意到一些逻辑关系,如某个控件变化了会影响到哪些控件跟着一起变化等。还有,为完善程序,最好提供一个捕获输入非法字符的异常处理。 时间仓促,只能写这么一点了,希望大家有所收益。 附: 利用MVC模式开发Java应用程序
|
图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运行时,将鼠标移动到球体的外圆处,点击拖动即可实现球体的放大与缩小,同时球体半径、表面积与球体积也同时变化。
小结
从上面介绍可以看出,通过MVC模式实现与图形用户化界面相关的应用程序具有极其良好的可扩展性,是Java面向对象编程的未来方向。
<script type="text/javascript"> function TempSave(ElementID) { CommentsPersistDiv.setAttribute("CommentContent",document.getElementById(ElementID).value); CommentsPersistDiv.save("CommentXMLStore"); } function Restore(ElementID) { CommentsPersistDiv.load("CommentXMLStore"); document.getElementById(ElementID).value=CommentsPersistDiv.getAttribute("CommentContent"); } </script> |
来源: http://www.javaresearch.org/index.jsp |