|

楼主 |
发表于 2004-6-26 21:54:57
|
显示全部楼层
行为模式
行为模式涉及到算法和对象职责间分配 行为模式不仅描述类或对象的模式 还描述它们之间的通信模式 这些模式刻划了运行时难以跟踪的复杂的控制流
行为类模式使用继承机制在类间分派行为 行为对象模式使用对象复合而不是继承 描述了它们怎样配合完成其中任意一个对象都无法完成的任务
下面把包括的模式说明一下
行为型类模式
解释器interpreter 给定一个语言 定义它的文法的一种表示 并定义一个解释器 这个解释器使用该表示来解释语言中的句子
最简单的使用是读配置文件了 最复杂的使用是用它来进行yacc或是lex语法文件的解释
模板方法template method 定义一个操作中的算法的骨架 而将一些步骤延迟到子类中.template method使可不改变一个算法的结构即可重定义该算法的某些特定步骤
书上例子是OpenDocument函数,它定义了这个函数的框架 也就是这个函数的主要步骤
但是CanOpeDocument和 DoCreateDocument 在子类中实现 这样可在子类中定义具体的操作方法
总结: 在父类中定义了操作的基本步骤 但是每个具体步骤的动作却在子类中实现 这就叫模板
行为型对象模式
责任链 chain of responsiblity 使多个对象都有机会处理请求,从而避免请求的发送者与接收者之间的耦合关系.将这些对象连成一条链 并沿着这条链传递请求 直到有一个对象处理它为此
如果你开发过界面编程的话 如windows GUI编程 那消息的处理方法就是职责链的形式 一个消息在消息处理对象组成的链中传送 如果哪个对象愿意处理它就处理
命令 command 将一个请求封装为对象 从而可使你对不同的请求进行参数化 对请求排除或是记录日志 及支持可撤消的操作
这可以认为是回调在面向对象中的扩展
书中例子是界面操作请求封装成对象的形式 每个对象内说明要进行的操作 如past请求对象的操作是从剪切板粘贴内容
迭代器 iterator 提供一种方法顺序访问一个聚和对象中各个元素 而又不暴露该对象的内部表示
如果使用过stl 的话 对这个就容易理解 每个容器都定义了一个迭代器用于访问这个容器内的各元素 同时使用iterator时不必知道各元素在容器内是怎样保存的 如是顺序保存还是链表方式保存的 没有暴露封装性
如
vector<int> a;
...赋值
for(vectir<int>::iterator iter = a.begin();iter != a.end();i++) 操作;
从上面看不出元素是怎样保存的 就是换成list一样可以成功运行
中介者 mediator 用一个中介者来封装一系列的对象交互.中介者使各对象不需要显式的相互引用,从而使耦合松散,而且可以独立的改变它们的交互
如果一个模块中有多个对象 并且它们又需要相互联系 这时就会降低它们的可复用性
这时可以引入一个中介者
中介者负责控制和协调一组对象间的交互 ,中介者充当一个中介 以使组中的对象不再相互显式引用 也就是 这些对象只知道中介者 从而减少相互引用的数目
书上例子是一个对话框 对话框窗体知道它包括的所有组件 并协调它们间的交互 看那个图很好理解 所有的对象都把消息传到中介者那里 再由中介者把这消息中转给其它对象
备忘录 memento 在不破坏封状性的情况下 捕获一个对象的内部状态 并在此对象之外保存这个状态 这样可以将此对象恢复到原先保存的状态
这个技术类似于数据库技术中的检查点 或是事务
备忘录的提出是为了提供类似事务的功能 对某些逻辑上取消比较麻烦的对象使用备忘录来直接还原
备忘录模式的参与者有两个对象 一个是备忘录(memento) 用于保存状态 另一个是原发者(originator)是被保存状态的对象
观察者 observer 定义对象间的一种一对多的关系 当一个对象的状态改变时 所有依赖于它的对象都得到通知并被自动更新
这一模式有两个关键对象 一个是目标(subject) 另一个是观察者(observer) 一个目标可以有任意多个依赖于它的观察者 一旦目标状态改变 所有的观察者都得到通知 每个观察者都向目标查询以同步状态
典型的应用是界面开发中数据改变时界面的显示了
状态 stat 允许一个对象在其内部状态改变时改变它的行为 对象看起来似乎改变了它的类
这个 简单的说就是对象的行为由它当前的状态决定 如对象内有tcpsend ,如果还没有连接那调用时是返回错误 如果已连接那调用时是返回成功
策略 strategy 定义一系列的算法 然后把它们封装起来 使它们可以相互替换.本模式使算法可独立于使用它的客户而变化
目标是为了可在运行时动态改变算法
访问者 visitor 表示一个任务于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下,定义作用于这些元素的新操作
具体来说 就是把对象的操作与数据分开 把操作放在一个独立的对象--访问者中
当访问者访问对象时,把访问者传送给当前访问对象
被访问对象接受访问者时 向访问者发送一个包含自身信息的请求
访问者对被访问对象提供的数据进行操作 |
|