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应用程序[组图]的更多相关文章

  1. 利用mvc模式,实现用户的注册

    实现功能:利用mvc模式,实现用户的登陆注册功能 1.程序的框架结构 2个包,bean,以及servlet 3个jsp页面,注册页面,注册成功页面,注册失败页面 mysql驱动 2.编程思想 通过js ...

  2. JavaFX桌面应用-MVC模式开发,“真香”

    使用mvc模块开发JavaFX桌面应用在JavaFX系列文章第一篇 JavaFX桌面应用开发-HelloWorld 已经提到过,这里单独整理使用mvc模式开发开发的流程. ~ JavaFX桌面应用开发 ...

  3. 【Web开发】Mean web开发 01-Express实现MVC模式开发

    简介 Mean是JavaScript的全栈开发框架.更多介绍 用Express实现MVC模式开发是Mean Web全栈开发中的一部分. Express 是一个基于 Node.js 平台的极简.灵活的 ...

  4. Swing用于开发Java应用程序用户界面

    Swing是一个用于开发Java应用程序用户界面的开发工具包. 以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格. Swing开发人员只用很少的代码就可以利用Swing丰富 ...

  5. Spring MVC + Spring + Mybitis开发Java Web程序基础

    Spring MVC + Spring + Mybitis是除了SSH外的另外一种常见的web框架组合. Java web开发和普通的Java应用程序开发是不太一样的,下面是一个Java web开发在 ...

  6. MVC模式在Java Web应用程序中的实例分析

    MVC在软件架构中是一种比较重要的架构思想,已经被广泛的应用在实际的java web项目开发中,我们所要了解和掌握的是mvc的架构思想和使用mvc模式来分析和解决问题的方法.当然相同或不同的项目都有各 ...

  7. 利用Scala语言开发Spark应用程序

    Spark内核是由Scala语言开发的,因此使用Scala语言开发Spark应用程序是自然而然的事情.如果你对Scala语言还不太熟悉,可 以阅读网络教程A Scala Tutorial for Ja ...

  8. Extjs MVC模式开发,循序渐进(一)

    本文讲述extjs mvc的Helloworld,tabPanel,event,页面布局layout等内容. 本页包含:MVC模式案例(一)~MVC模式案例(六),从搭建extjs mvc到点击按钮生 ...

  9. 利用Android studio开发Java工程

    1. 新建项目 新建项目肯定是去new,但到底是new project还是new module是一个问题.在这解释一下,如果new project的话是新建一个工程,相当于新建一个工作区,工程中可以有 ...

随机推荐

  1. BZOJ 2768: [JLOI2010]冠军调查 最小割

    2768: [JLOI2010]冠军调查 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2768 Description 一年一度的欧洲足 ...

  2. Looksery Cup 2015 D. Haar Features 暴力

    D. Haar Features Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/549/prob ...

  3. Codeforces Round #310 (Div. 2) A. Case of the Zeros and Ones 水题

    A. Case of the Zeros and Ones Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/con ...

  4. 使用PageHeap.EXE或GFlags.EXE检查内存越界错误 (转)

    2011-05-27 20:19 290人阅读 评论(0) 收藏 举报 microsoftdebuggingstructureoutputimagefile 必先利其器之一:使用PageHeap.EX ...

  5. (转)用AGG实现高质量图形输出(四)

    AGG的字符输出 字符输出,对于AGG来说,这个功能可以处于显示流程的 不同位置.比如字体引擎可直接处于“Scanline Rasterizer”层向渲染器提供已处理完毕的扫描线,也可以处于“Vert ...

  6. 一步步学Mybatis-实现单表情况下的CRUD操作 (3)

    今天这一章要紧接上一讲中的东西,本章中创建基于单表操作的CRUD与GetList操作,此示例中以Visitor表为范例,为了创建一点测试数据我们先弄个Add方法吧 继续在上次的IVisitorOper ...

  7. JavaScript Design Patterns: Mediator

    The Mediator Design Pattern The Mediator is a behavioral design pattern in which objects, instead of ...

  8. Swift 本地推送通知UILocalNotification

    Notification是智能手机应用开发中常用的信息传递机制,它不用消耗更多资源去不停的检查信息状态,可以非常好的节省资源. 在iOS中分为两种通知:本地.远程.本地的UILocalNotifica ...

  9. EntityFrameWork关系映射

    转:http://kb.cnblogs.com/page/108643/ Entity Framework 实体关系总结 作者: dudu  来源: 博客园  发布时间: 2011-10-28 20: ...

  10. MySQL Order By实现原理分析和Filesort优化

    http://blog.csdn.net/hguisu/article/category/796963