Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

java类库中的设计模式(3)

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

  Java中的设计模式(二)设计模式在Java中类库的应用

  前面说过了,在Java类库中设计模式的踪影随处可见,因而要讲解所有出现的模式实在是不可能,这儿主要把焦点聚集在AWT/Swing中,管中窥豹,却也可以了解设计模式的一些深刻的含义所在。

  2.2 Bridge模式和对等体(3月13日)

  Java号称的平台无关性,一部分要归功于Bridge模式。因为AWT中使用的对等体的概念,就是Bridge模式的一个应用。对等体在AWT中是一个非常重要的概念。每个AWT组件都会有其相应平台上的对等体,来实现这个组件基本的平台相关的特性,而AWT组件实际上是一种高层次上的抽象。

  对大部分的开发者而言,并不需要直接处理对等体,绝大部分调用对等体的细节都被AWT组件包装起来了。对于用户事件则相反,由对等体接受后进行封装,然后传递给组件调用相应的事件响应过程。下面我们来看看对等体实现的类图:

  在每一个平台上,对每一个组件而言,都有相应的平台相关的对等体。这也就是Java程序能够“一处编写,到处运行”的一个原因了。

  在新的Swing构件中,对等体的概念已经被抛弃。因为虽然对等体能够实现跨平台的功能,但是相对于所能解决的问题,对等体还会带来一些更多的副作用,比如如果在对等体被创建之前调用组件的方法,就会产生很多问题。但是,这并不会丝毫减少Bridge模式的魅力。下面我们就来看看Bridge模式的一些详细的情况。

  一般的,我们需要将抽象与实现分离来实现更好的可重用性,这也是设计模式的主题思想之一。通常,我们都是用的继承一个抽象类来实现这一目的的。但是有时候继承在解决问题的时候,还会带来一些另外的问题。比如,在继承类中,抽象和实现还是结合在一起的。再有就是,继承所带来的灵活性不够,当修改抽象或者实现的一部分的时候,就必须修改整个的类结构体系,这是非常麻烦的。

  Bridge模式的主要作用就是分离抽象与实现,使这两个部分都能够较为独立的变化。特别是当一个抽象对应于多个实现的时候,Bridge模式的功用更是明显。我们来看看它的类图,就会知道它为什么能够实现这种功用了:

  在抽象中定义的方法的是通过它维持的一个实现的引用,并调用这个实现中的一系列方法来实现的。一般的,在抽象中所定义的方法是比较高程层次的,而在实现中定义一些底层的方法来供调用。客户所能够看到的,只是抽象中所定义的接口。通过那个引用imp,就可以很容易实现抽象和实现的分离,并保证一边的变动不会影响到另外一边。

  这只是给出了一个比较简略的结构图,实际上,在Abstraction和Implementor两边,都可以分别由两个互不相关的类层次。

  需要提到的是,在创建对等体的过程中还使用了另外的一个模式:AbstractFactory,它是如何用到的呢?你看了下面的内容就知道了。

  2.3 AbstractFactory模式和视感

  前面介绍过工厂方法模式,这儿又来了一个抽象工厂模式。这两个模式大同小异,所以有时候会一起略称为工厂模式。与工厂方法模式不同,抽象工厂模式要做的,不仅仅是创建一个对象,而是创建一系列相关的对象群。

  在最新的Swing组件中支持视感(Look and Feel)的概念,也就是说,一个程序可以有多个不同的外观,而且它是集成在类库中的,实现起来毫不费劲。确实是一件非常令人感到欣喜的事情,可能下面的这条语句你已经见过N遍了:


 UIManager.setLookAndFeel(
 UIManager.getCrossPlatformLookAndFeelClassName());

  只需要这么简单的一条语句,就可以改变整个程序的外观,真的怎一个爽字了得。

  Swing的多视感的组件,实际上就是多个系列的不同外观感觉(也由部分操作不一样)组件对象群。这多个系列继承了同一个抽象接口,我们在编程的时候,只需要按照这个接口编程,就可以使程序不需任何变动,而在多个视感之间动态的切换。而Swing是如何实现这些不同的视感组件的创建的呢?它借助了AbstractFactory模式。AbstractFactory模式提供了一个创建一系列相关或相互依赖对象的接口,而无须指定指定它们具体的类。我们来看一看AbstractFactory模式的类图,以便更清楚的了解AbstractFactory模式实现的细节。

  这个图看起来有些费劲,我来解释一下你就明白了。

  AbstractFactory提供了一个抽象的接口,来创建一个系列对象中的每个对象。在图中可以看出它能够创建ProductA和ProductB这两个对象。这两个对象的接口是由AbstractProductA和AbstractProductB这两个抽象类所定义的。AbstractFacotry的子类ConcreteFactory1和ConcreteFactory2分别实现了AbstractFacotry中所定义的接口,每个具体的工厂都用来创建其各自的对象群,虽然这些对象的实现各不相同,但是它们都遵循共同的接口,也就是说,根据AbstractProductA和AbstractProductB所创建的程序,可以完全不加修改的运行在由ConcreteFactory1或ConcreteFactory2所创建的对象群中。

  具体就Swing而言,它的三个不同的视感Metal,Motif,Windows就是三类遵循了相同接口的对象群,而每一个Swing组件就是就是这个对象群中的对象。当用户通过上面的程序短设置了程序中要使用的视感后,就相当于创建了一个与这个视感相关的组件工厂,当你调用类似于“aButton=new Jbutton()”这样的语句的时候,一个具有这种视感外观的对象就被这个工厂创建并返回了。

  从上面的讲解可以看到一些AbstractFactory模式的好处,首先:它分离了具体的类,将客户与类的实现分离了,便于程序的复用。第二:它使得交换一个系列的类变得很容易,只需要创建一个具体工厂,在由这个具体工厂生成具有同样接口的对象,而程序不需要任何的改动!

  上面我们提到对等体的创建也利用到了AbstractFactory模式,现在你因该搞得清楚对等体是如何被创建了的吧。

  2.4 Strategy模式和布局管理器

  AWT/Swing中的特色之一就是布局管理器。布局管理器是Java程序中GUI的基础,相信大家都不会陌生吧。但是布局管理器是作为Strategy模式实现的可能知道的人就不多了(至少我初学Java的时候就不知道)。

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:java类库中的设计模式(2)   下一篇:java类库中的设计模式(4)

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号