职责链
代码实例
- 对一个请求
一个对象可以自己处理,也可以移交给指定对象处理.
所有能处理此请求的对象按先后次序可以构成一个动态变化的链表.
对请求的处理单独抽取出来组成一个类层次
命令
代码示例
- 责任链处理的是命令在多个对象间的传递关系
命令模式处理的是具体命令实现
将命令进行抽象建模,具体功能作为具体命令派生类
责任链的重点是命令的转发,命令模式的重点是命令的实现.
两者在实际应用中,可以无缝的结合使用.
带来的好处:
1.避免同样的命令模式在多个地方重复实现的问题
2.将命令抽象出来可以强化命令功能
如支持重做,撤销,历史记录等.若采用分散在具体响应处具体实现则不可能.
解释器
代码实例
- 适合按表达式对文本信息进行表达式化的求值,解释.获取表达式结果.
迭代器
外部迭代器代码实例
- 迭代器的作用
1.允许将容器类的遍历接口与容器类其他接口分离,进而独立演化[但仍需容器类提供支撑]
2.允许一个容器同时进行多个遍历
代码实例
内部迭代器,即提供一个遍历接口,接口实现中对容器进行遍历.
中介者
代码实例
- 对象间通过指针进行通信
一个父对象有多个子对象,
子对象可以给父对象发消息[通过指针调用方式],
父对象也可控制子对象.
除了通过指针进行函数调用方式来进行控制交互.
Qt的信号-槽,windows的消息机制也可实现控制交互.
备忘录
代码实例
- 将一些可以放在类实现中的状态信息抽取出来,放到一个单独的类.
包含状态信息的类与原始类进行交互
观察者
代码实例
- 常用语分离数据和视图
数据对象发生某个变化事件,通知视图对象更新.
视图对象通过注册来让数据对象知道某个变化事件发生时要更新哪些视图对象.
视图可以利用数据对象获取更新所需数据,也可将所需数据作为函数参数进行传递.
视图对象还可响应用户操作输入,
然后对数据对象进行更新.
响应用户输入以更新数据对象,可以直接嵌入在视图对象中.
更加模块化设计下,一般通过一个控制对象完成.[这样便于将用户输入如何响应抽取为一个独立的模块,独立演化]
数据对象的功能:
维护底层数据[数据操纵内部接口/外部接口]
提供数据访问接口
提供更新接口
视图对象的功能:
显示数据
注册到数据对象指定事件
响应用户输入[将用户输入传递给控制对象处理]
控制对象功能:
对用户输入事件进行处理[利用数据对象接口更新底层数据]
状态
代码实例
- 在一些功能类中
常常会有一些操作,在不同模式/状态下具有不同的响应方式.
常见的做法是在类内部设置模式/状态变量.
在每个相关响应处依次对每种模式/状态给出处理代码.
这样一个不好地方是,一个模式/状态的处理散落在各个地方,每个响应处也因为条件分支而出现大段代码.
这时,可考虑应用状态模式.
把状态/模式抽象为一个类层次,
基类提供所有响应接口
每个派生类提供特定状态/模式下对接口的具体响应处理.
状态/模式依赖语境,可将关联语境对象作为参数传递,并将状态/模式类设为语境类的友元.
策略
代码实例
- 类似状态
区别在于状态/模式会涉及到一系列相关联的响应
策略,主要针对一个具体请求给予不同响应策略.
传统上,将请求的每个策略放在请求类中,不利于模块化和独立演化.
策略模式下,策略构成一个类层次.
基类可提供实现所需策略的一些基础设施支撑,
每个具体策略作为一个具体派生类实现.
方便了维护和扩展.这里使用策略的对象构成了策略执行的语境.
策略处理中,一般会需要获取语境相关信息.
模板方法
- 模板方法定义了一个响应的处理步骤
但允许其派生类,对每个步骤按自己的方式进行处理
代码实例
访问者
- 假设要访问一个结点集合,
节点由多种类型构成
希望对每种节点类型由多种可能的访问操作.
此时,
节点类型作为一个独立维护的类层次
访问作为一个独立维护的类层次.
可以较好实现这种多对多的结构.
这样层次划分,相比于不划分的做法更有利于模块化
代码实例