java类库中的设计模式(4)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读取串口的程序 更多相关文章
|
推荐文章
精彩文章
|