从Java类库看设计模式(5)

有了前面诸多设计模式的基础,这儿可以提出一个比较特殊的模式MVC。MVC并不属于GOF 的23个设计模式之列,但是它在GOF的书中作为一个重要的例子被提出来,并给予了很高的评 价。一般的来讲,我们认为GOF的23个模式是一些中级的模式,在它下面还可以抽象出一些更 为一般的低层的模式,在其上也可以通过组合来得到一些高级的模式。MVC就可以看作是一些 模式进行组合之后的结果(实际上,MVC的出现要早于设计模式的提出,这而只是对它在设计 模式的基础上进行在分析)。如果没有前面的基础,理解MVC或许会有一些困难。

MVC模式

MVC模式比较的特别,它含义比较的广,涉及的层面也不仅仅是设计这一块,不好简单的 把它归为设计模式。当然,它主要还是作为一个设计的概念被提到的,而且在Java体系中, MVC有着至关重要的作用。这儿提的是Java中的设计模式,当然不好拉了它不讲了。

关于MVC的来龙去脉,这儿就不再讲了。这里主s要讲两个方面的:作为设计模式的MVC和 作为体系结构模式的MVC。

所谓MVC,指的是一种划分系统功能的方法,它将一个系统划分为三个部分:

模型(Model):封装的是数据源和所有基于对这些数据的操作。在一个组件中,Model往 往表示组件的状态和操作状态的方法。

视图(View):封装的是对数据源Model的一种显示。一个模型可以由多个视图,而一个 视图理论上也可以同不同的模型关联起来。

控制器(Control):封装的是外界作用于模型的操作。通常,这些操作会转发到模型上 ,并调用模型中相应的一个或者多个方法。一般Controller在Model和View之间起到了沟通的 作用,处理用户在View上的输入,并转发给Model。这样Model和View两者之间可以做到松散 耦合,甚至可以彼此不知道对方,而由Controller连接起这两个部分。

有了前面介绍的诸多模式之后,就可以很容易的通过模式来解释MVC的内在行为了。前面 说过,在设计模式中,MVC实际上是一个比较高层的模式,它由多个更基本的设计模式组合而 成,Model-View的关系实际上是Observer模式,模型的状态和试图的显示相互响应,而View -Controller则是由Strategy模式所描叙的,View用一个特定的Controller的实例来实现一个 特定的响应策略,更换不同的Controller,可以改变View对用户输入的响应。而其它的一些 设计模式也很容易组合到这个体系中。比如,通过Composite模式,可以将多个View嵌套组合 起来;通过FactoryMethod模式来指定View的Controller,等等。

使用MVC的好处,一方面,分离数据和其表示,使得添加或者删除一个用户视图变得很容 易,甚至可以在程序执行时动态的进行。Model和View能够单独的开发,增加了程序了可维护 性,可扩展性,并使测试变得更为容易。另一方面,将控制逻辑和表现界面分离,允许程序 能够在运行时根据工作流,用户习惯或者模型状态来动态选择不同的用户界面。

Swing号称是完全按照MVC的思路来进行设计的。在设计开始前,Swing的希望能够达到的 目标就包括:

模型驱动(Model-Driven)的编程方式。

提供一套单一的API,但是能够支持多种视感(look-and-feel),为用户提供不同的界面 。

很自然的可以发现,使用MVC模式能够有助于实现上面的这两个目标。

严格的说,Swing中的MVC实际上是MVC的一个变体:M-VC。 Swing中只显示的定义了Model 接口,而在一个UI对象中集成了视图和控制器的部分机制。View和Control比较松散的交叉组 合在一起,而更多的控制逻辑是在事件监听者部分引入的。

但是,这并没有妨碍在Swing中体现MVC的精髓。事实上,在Swing的开发初期,Swing确实 是按照标准的MVC模式来设计的,但是很快的问题就出现了:View和Controller实际上是紧密 耦合的,很难作出一个能够适应不同View的一般化的Controller来,而且,一般也没有很大 的必要。

时间: 2024-08-30 09:56:08

从Java类库看设计模式(5)的相关文章

从Java类库看设计模式(2)

在上一部分的内容中,我们讲到什么是模式,什么是设计模式,以及对一个设计模式 Observer的详细阐叙.相信大家对于模式的概念应该是比较的理解了.这部分及以后的内容 ,将会步入正题,从Java类库的分析入手,来阐叙设计模式是如何应用到一个完美的设计中 的.实际上,Java类库非常的庞杂,这儿不可能把所有能够找到的设计模式的例子一一列举 ,只是找了一些容易发现的例子.实际上也没有必要,因为只要对一个设计模式有足够的理 解,对于它的具体应用而言,倒是一件不是很困难的事情. Command模式 在设计

从Java类库看设计模式(1)

在这一部分的内容中,介绍的是一个相对简单但功能强大的模式:Observer模式.希望通 过这部分地叙述,大家看了之后,能够对设计模式有一个比较全面地,感性的认识. 很多时候,对于一个设计来说(软件上的,建筑上的,或者它他工业上的),经验是至关 重要的.好的经验给我们以指导,并节约我们的时间:坏的经验则给我们以借鉴,可以减少 失败的风险.然而,从知识层面上来讲,经验只是作为一种工作的积累而存在于个人的大脑 中的,很难被传授或者记录.为了解决这样的问题,人们提出了所谓的模式的概念.所谓模 式,是指在

从Java类库看设计模式(3)

上一次主要介绍了几个创建型的设计模式AbstractFactroy,FactoryMethod和Singliton .它们的共同的特点,都是用来创建对象的.这次接下来的内容,涉及到的是几个结构型的 模式.所谓结构型模式,就是用来解决在创建系统结构的过程中,通过对类或者对象进行合 理有效的组合,以获得更大的结构的方法.这儿主要讲到了Bridge模式和Decorator模式.对 于Bridge模式可能需要更多的理解,因为它在很大程度上说,例示了设计模式的基本的设计 思路和原则. Bridge模式 当

从Java类库看设计模式(4)

在上一部分中,介绍了两个结构型的模式:Bridge和Decorator.这一部分的内容,将会 接着上面的讲解,继续我们的设计模式之旅. 这一部分,除了还会介绍一个结构型的Composite模式之外,还会有两个行为模式登场. 实际上在前面的内容中,我们已经接触到行为模式了:Observer和Command就是两个典型的行 为模式.行为模式更多的注重于算法和对象建间职责的分配,也就是说,它会更多的关注于 这个模式系统之类的各对象协作间的语义,以及在对象间进行通讯的流控制. Composite模式 毫

《Java 7程序设计入门经典》一1.17 Java类库

1.17 Java类库 本章展示的示例程序充分利用了Java的两个内置函数:println()和print().这些方法是System类的成员.System类是一个由Java预定义的类,它会自动添加到程序中.从更大的范围看,Java环境依赖于一些内置的类库(class library),它包含许多内置的方法,来提供对输入/输出.字符串处理.网络.图形用户界面等功能的支持.所以从总体来看,Java是其语言本身与其标准类的结合.之后将会看到,类库提供Java的许多功能.实际上,Java程序员需要学习

PHP如何调用JAVA 类库

JAVA是个非常强大的编程利器,它的扩展库也是非常的有用,这篇教程,主要讲述怎样使用PHP调用功能强大的JAVA 类库(classes).为了方便你的学习,这篇教程将包括JAVA的安装及一些基本的例子. Windows下的安装 第一步:安装JDK,这是非常容易的,你只需一路回车的安装好.然后做好以下步骤. 在 Win9x 下加入 :"PATH=%PATH%;C:\jdk1.2.2\bin" 到AUTOEXEC.BAT文件中 在 NT 下加入 ";C:\jdk1.2.2\bin

怎样使用PHP调用功能强大的JAVA 类库

JAVA是个非常强大的编程利器,它的扩展库也是非常的有用,这篇教程,主要讲述怎样使用PHP调用功能强大的JAVA 类库(classes).为了方便你的学习,这篇教程将包括JAVA的安装及一些基本的例子. windows下的安装 第一步:安装JDK,这是非常容易的,你只需一路回车的安装好.然后做好以下步骤. 在 Win9x 下加入 :"PATH=%PATH%;C:\jdk1.2.2\bin" 到AUTOEXEC.BAT文件中 在 NT 下加入 ";C:\jdk1.2.2\bin

怎样使用PHP调用功能强大的JAVA类库

JAVA是个非常强大的编程利器,它的扩展库也是非常的有用,这篇教程,主要讲述怎样使用PHP调用功能强大的JAVA 类库(classes).为了方便你的学习,这篇教程将包括JAVA的安装及一些基本的例子. windows下的安装 第一步:安装JDK,这是非常容易的,你只需一路回车的安装好.然后做好以下步骤. 在 Win9x 下加入 :"PATH=%PATH%;C:\jdk1.2.2\bin" 到AUTOEXEC.BAT文件中 在 NT 下加入 ";C:\jdk1.2.2\bin

java-ImageJ里的Bonej中的thickness算法,有人能解释原理吗?JAVA我看不懂

问题描述 ImageJ里的Bonej中的thickness算法,有人能解释原理吗?JAVA我看不懂 ImageJ里的Bonej中的thickness算法,有人能解释原理吗? 解决方案 二值图像细化,你可以尝试Zhang-Suen thinning算法,代码在本人博客上有说明