2004-08-31
构建型模式和结构型模式强调的都是静态的类实体之间的关系,行为型模式着力解决的是类实体之间的通讯关系。希望以面向对象的方式描述一个控制流程。
以往的经历中大多是解决类实体的封装问题,对于类之间的通讯方式上,并没有刻意的去理解,所以有些行为型模式相对陌生。
还有一个原因就是行为型模式和面向过程的东西有很多近似之处,导致一定的理解的混淆。
从笔记就可以看出理解的不够,可以再专门针对行为型模式做些细节的学习。
1 chain of responsibility(职责链)-行为型对象模式
这是个“请求”处理的模式。他提供一个思路,来解决“请求”在一组具有一定结构的类之间传递时的问题,所以,我认为这只是一种思路,一种将“请求”象链条一样传导出去的方式。他的具体传递方式,除了和链的设计有关之外,最重要的是和对象组的结构有关。
当然,如果没有结构的对象组,我们也可以强行的动态构建一个链,这种方式虽然复杂和略土,但肯定更加的灵活,不仅能控制处理,还能控制链的走向。
一般来看,composite模式和这种模式经常在一起,Microsoft IE中的文档事件模型应该采用的就是这样的模式。
2 command(命令)-行为型对象模式
将请求封装为一个对象,从而可以对请求做一些统一性处理,如:排队、日志、撤销等。
适用性:
1、是回调机制的一个面向对象的替代品
2、在不同时期指定、排列、和执行请求
3、支持取消操作,但是,此处对象的状态存储是个麻烦的东西。
4、支持原语操作上构建高层操作的系统。这种在支持“事务”的系统中很常见。
理解还是不很透彻
3、Iterator(迭代器)-行为型对象模式
将聚合类的遍历算法封装为Iterator,从而封装对象的内部表示。
Iterator分为外部和内部,外部更加灵活,内部传入参数简单(只需要操作),内部Iterator自动遍历所有元素。
Iterator可以封装算法,也可以只记录状态,由聚合类封装算法,封装算法的iterator可能会破坏聚合类的封装性。
4、mediator(中介者)
mediator希望通过一个中控对象来完成对多个对象的关系的管理。
将多数可以可以重用的组件无关联的构建起来,而他们之间的关系由额外的对象来完成。
在图形化编程里,可以用此模式和listener机制(observer模式)结合使用,更加方便,进一步解除了中控对象与其他对象的耦合。
5、memento(备忘录)/token
原发器(originator)(需要保存状态的)申请一个备忘录(memento),并自己将状态保存进去,然后,将备忘录交给管理者(caretaker),当出现需要的时候,管理者将合适的备忘录交给原发器,原发器自己恢复自己的
状态。
memento模式,从originator中分离了保存客户请求状态的过程。并且memento的存储和解释都是由originator完成,保证了封装的边界。
如果备忘录的创建及其返回(给原发器)的顺序是可预测的,备忘录可以存储增量改变。
6、observer(观察者)/依赖(dependents)/发布-订阅(Publish-Subject)
suject(目标)和observer(观察者)是关键对象,suject和不固定的observer发生关系,将这种关系解耦是这个模式的主要功能,listener机制可以看作这种模式的一个实现,当然mvc也是这种模式的一个好的应用场景。
与mediator的区别主要体现在,observer是一个对关联关系的解耦过程,而mediator更加注重各个对象执行的功能。
7、state(状态)/状态对象(Objects for Status)
允许一个对象在改变其状态的时候改变它的行为,使得对象似乎修改了自己的类。
1、将状态相关的行为局部化。
2、状态转换显式化
我们可以根据当前窗口的状态来转变窗口的菜单和操作,这种方式可以用state模式来实现。
8、strategy(策略)
将算法单独的封装起来,使得它独立于其他对象的变化。
其实这种方式和面向过程里的一个算法函数封装基本是一样的,只是由于封装成为了类,会有一些接口统一的便于替换的特性。
9、visitor(访问者)
这种模式的主要目的是分离操作和对象,追求的是对象的重用和简单,以及操作的可替代性。
相对来说,strategy模式更加追求的是封装操作,追求操作的重用性。
observer、mediator追求分离对象之间的关系与对象本身。
以上都是对象级别的行为模式,以下是类级别的行为模式
1、template(模板)
定义一个算法的骨架,并将其中一些步骤延迟到子类中。
这种使用较多,不多说了。
2、interpreter(解释器)
本模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。
这种方式在正则表达式中比较明显,在以往的程序应用中,特别是上层应用中很少用到。
expression::= literal | alternation | sequence | repetition | '(' expression ')'
alternation ::= expression '|' expression
sequence ::= expression '&' expression
repetition ::= expression '*'
literal ::= 'a'|'b'|...{'a'|'b'|...}*
相关的关键参与者为:
1、abstractExpression(抽象表达式,统一的接口)
2、terminalExpression(终结符表达式)
3、nonterminalExpression(非终结符表达式)