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

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

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

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

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

  2.5 Command模式和Action接口(3月14日)

  在Swing中摒弃了原有的老的AWT基于继承的事件模型,而根据Stragety模式引入新的基于授权的事件模型。在这种模型中,事件处理涉及到三个方面:构件,事件和监听器(Listener),由构件激发事件,在由事件监听器接受并处理事件。

  所有的行动类事件监听器都要实现ActionListener接口,在ActionListener中只定义了一个actionPerformed()方法,对与每个注册了这个监听器的组件,当其中发生了行动类事件(比如按钮按下)时,就会调用actionPerformed()方法来响应事件。但是当多个事件共享一个操作的时,比如,很多时候都需要为一个快捷键,一个工具栏上的按钮,一个菜单项设置相同的处理函数,如果用ActionListner的话,就要分别为这三类事件注册三个不同的事件监听器,很是麻烦(因为这三种事件需要不同的监听器来接受,但是这三种监听器都是ActionListner的子接口,因而理论上可以用一个实现了ActionListner的类来代替这三个接口,但是我没有试验过是否可行)。Swing中为了避免麻烦,引入了Action接口。

  Action实际上是ActionListener的子接口,扩展了ActionListener用来处理同一个事件响应过程要被多个事件激发的情况。当然Action中还包含了一些其它的有用的东西,比如可以包含多个行动描叙和图标,但是在这儿我们讨论的只是Action接口中所体现的Command模式。

  Command模式将请求封装为一个对象,这种封装可以带来很多的好处,比如可以让你用不同的请求来对客户进行参数化。还有用的很多的,比如用Ctrl+Z实现撤销,用Ctrl+Y进行重做等等,都可以用Command模式轻松实现。

  Command模式体现了一种高度抽象的面向对象的建模方法,确实应该值得好好注意。

  下面给出了Command模式的类图:

  首先需要为Invoker对象注册一个实现了Command接口的ConcreteCommand对象,当事件促发时,Invoker根据Command接口来对ConcreteCommand进行请求调用,而ConcreteCommand对象则需要协同Receiver对象一起来完成这个请求。上面就是这个模式所包含的对象之间的协作关系。如果你的Swing的事件模型比较了解的话,那么就会发现,这和那个事件模型其实没有什么实质上的分别。

  2.6 MVC模式和Swing组件

  最后要讲的一个MVC模式其实并没有在设计模式那本书中所列的23个模式中出现,而是作为一个例子出现在书中的。但既然谈到设计模式在Java/AWT/Swing中的应用,我想很难回避这个模式而不言,因为可以说每一个Swing组件都是MVC模式的一个例子,Swing组件就是依据MVC模式而创建的。实际上Swing之所以能够很容易的实现多视感,也得感谢MVC模式啊。

  面向对象设计的一个原则是,永远不要让一个对象担负太多的责任,这样不利于重用。所谓MVC,指的是Model-View-Control,也就是模型-视图-控制器。通俗的讲,就是将一个系统(或者部件)的功能分成三个部分:模型部分用来保存数据,视图部分负责数据的显示,控制器用于控制响应用户输入。模型应该提供相应的方法来实现内容的修改。

  MVC模式本身也包含了一些其它的模式。一个模型可以有多个视图与之对应,每个视图均反映模型的一个侧面或者一种表现形式,当一个视图接受了用户事件,并通过控制器改变了模型的内容时,其它的视图也会接受到这种变化,这是Observer模式的一个例子。在有,MVC模式允许你在不改变视图的情况下改变视图对用户的响应方式,这不就是前面讲到的Strategy模式嘛。而对一个视图而言,在多个控制器中进行选者,又会用到FactoryMethod模式。

  BWT,现在很流行一种说法,模式正在成为一种语言,一种文化。这种语言和文化加深了我们对一个问题的理解和表叙能力。上面我就是这种模式语言来解释了MVC的一些特征,没有多费口舌,我想你也应该明了了其中的含义了吧。如果你不想连别人的话都听不懂的话,赶快来学习这门最时髦的语言吧。

  在Swing中,对于大多数组件来说,其模型都是由一个名字以Model结尾的接口实现的。例如对于Jbutton,又一个ButtonModel的接口,实现这个接口的类定义了各类按钮的状态。又一个DefaultButtonModel类实现了这个接口。而Jbutton用一个名为BasicButtonUI的类来实现其缺省的视图,另外的一个ButtonUIListener的类则作为控制器使用。

  大部分的Swing组件都有这样的一个类层次,但对于程序员而言,一般并不需要关心每个组件中的模型-视图-控制器关系,因为每个组件都提供了一个Wrapper类来封装协调这三个部分(比如Jbutton类),大多数情况下我们都是同这个Wrapper类打交道。但是对于模型-视图-控制器的理解和应用可以让我们的程序获得更大的自由。在后面的一部分中,我们会看到一个应用模型-视图-控制器来扩展组件功能的例子。




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



上一篇:java类库中的设计模式(3)   下一篇:一个使用Java读取串口的程序

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