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

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

 

 

下载源代码


〖 作者:leequn1984 〗〖 大小:30k 〗〖 发布日期:2005-12-16 〗〖 浏览:98 〗

 

  网上有一篇很精典的用来介绍利用MVC模式来开发Java应用程序的文章(附后),作者是 龚赤兵 。大家在google或baidu(此时用baidu搜索比较好)上用“利用MVC模式开发Java应用程序 龚奇兵”关键词来搜索便可找到。建议在看本文前请先阅览这篇文章。

相关文章:
(0)实战MVC模式
(1)我MVC改写的贪食蛇小游戏
(2)基于MVC架构编写的扫雷游戏

我通过实现并扩充这篇文章的例子来介绍MVC模式。程序的输出界面如图所示:

   <script type="text/javascript"> <!-- google_ad_client = "pub-1832179689702023"; google_ad_width = 120; google_ad_height = 240; google_ad_format = "120x240_as"; google_ad_type = "text_image"; google_ad_channel =""; //--> </script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>


  
 

         
程序要求的功能:
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应用程序
    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运行时,将鼠标移动到球体的外圆处,点击拖动即可实现球体的放大与缩小,同时球体半径、表面积与球体积也同时变化。

   小结

   从上面介绍可以看出,通过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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值