Visitor模式,Decorator模式,Extension Object模式
Modem结构

- Visitor模式

- 对于被访问(Modem)层次结构中的每一个派生类,访问者(Visitor)层次中都有一个对应的方法.
- 从派生类到方法的90度旋转.
- 新增类似的Windows配置函数时,Visitor模式使用Visitor派生类来代替了被访问者结构中的方法.
- 双重分发:accept()+visit()两个动态分发.
- 形成了一个功能矩阵:不同类型的Modem的轴线+不同OS的轴线.每一个单一都被一个功能(描绘了特定的Modem在特定的OS中使用的)填充.
- Acyclic Visitor模式
- Visitor模式的问题
- Modem依赖于ModemVisitor.
- 依赖环:Modem中每一个派生类在Visitor接口中都有一个对应的函数.这样将派生类绑定在一起了.
- 当Modem层次结构很不稳定,经常需要创建新派生类时,需要改动Visitor的整体继承结构.

- 将ModemVisitor退化为一个标记接口.
- 对于被访问层次结构中的每一个派生类,都有一个访问者接口.
- 从派生类到接口的180度旋转.
- 解除了依赖环,易于增加被访问者派生类.
- 创建了一个稀疏矩阵,访问者只需要针对需要使用的被访问者派生类进行实现处理.
- Visitor模式的问题
- Visitor模式的用途.
- Application中存在有需要以多种不同方式进行解释的数据结构时使用.
- 遍历大量的数据结构并产生报表.使得数据结构对象中不含有任何产生报表的代码.
- 例如,编译器的中间数据结构,APP中的配置数据结构.
- 使用访问者时,所使用的数据结构都独立于它的用途.
- 访问者的更改和新增,不会影响现有数据结构的重新编译和部署.
- Decorator模式
- Visitor模式之外,另一种可以在不改变现有类层次结构情况下向其中增加新方法.
- 针对最初的Modem设计,有些用户希望在Dial时听到拨号声,而另一些希望安静.
- 使用Template Method的方案:将Modem从接口变成类,并持有wantsSound变量,在Dial方法中,判断是否出声.
- 但是问题在于,Modem本身是不应该受到非其内在功能(拨号,链接)之外特性的影响而变动.

- 如果需要多个装饰者,那么添加一个ModemDecorator类来实现Modem接口.其它装饰者都继承自它.
- Extension Object模式
- 不更改类层次结构时,向其中新增功能.
- 层次结构中每一个对象都持有一个特定扩展对象的List.
- 通过扩展对象提供了操作原始层次结构对象的方法.

- 对于一个材料单系统,我们希望将数据输出到XML和CSV两种介质中去.
- 使用Visitor模式,会把Assembly/PiecePart及其它Part类型的输出XML的代码混合在一个Visitor对象中.
- 当我们想分离每种Part类型和每种输出介质类型的逻辑时,使用ExtensionObejct模式.
- BadPartExtension对象用于在getExtension()方法未找到合适的Extension Obejct时的返回值.
- 扩展对象是在每一个Part对象(Assembly/PiecePart)的构造函数中装入该对象中的
- Assembly()
- {addExtension("CSV",new CSVAssemblyExtension(this));
- addExtension("XML",new XMLAssemblyExtension(this));}
- 也就是part对象扔依赖于XML和CSV类.
- Assembly()
- 可以使用Factory对象去创建Part对象并装入扩展对象.
[Agile Software Development(Principles,Patterns,and Pracitices)]
Visitor模式,Decorator模式,Extension Object模式的更多相关文章
- 浅谈设计模式--装饰者模式(Decorator Pattern)
挖了设计模式这个坑,得继续填上.继续设计模式之路.这次讨论的模式,是 装饰者模式(Decorator Pattern) 装饰者模式,有时也叫包装者(Wrapper),主要用于静态或动态地为一个特定的对 ...
- Immutable Object模式
多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线 ...
- Java多线程编程模式实战指南(二):Immutable Object模式
多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线 ...
- Java多线程编程模式实战指南(二):Immutable Object模式--转载
本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-immutable-o ...
- 设计模式之美:Extension Object(扩展对象)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用示例结构实现 Extension Object. 实现方式(二):使用泛型实现 IExtensibleObject<T ...
- 来杯咖啡-装饰者模式(Decorator)
前言 上篇[观察者模式]发布已经近一个月了,个人感觉反应并不太理想,因为大家响应都不是很积极,不知是文章那里写得有问题,而且也没有人提出过有价值的改进建议,多少感觉有些失望L!因为工作繁忙,所以不可能 ...
- 七个结构模式之装饰者模式(Decorator Pattern)
定义: 使用组合的方法,动态给一个类增加一些额外的功能,避免因为使用子类继承而导致类继承结构复杂.并且可以保持和被装饰者同一个抽象接口,从而使客户端透明. 结构图: Component:抽象构件类,定 ...
- 【C#|.NET】从细节出发(三) 逻辑层事务和page object模式
一. 业务逻辑层的事务问题 如果你的程序分层清晰并且系统禁用复杂存储过程,那么在DA中的职责比较单一.程序的逻辑通过BLL调用各种不同模块的DA来实现数据操作.如果当需要不同模块在一个事务的时候,问题 ...
- 敏捷软件开发(3)---COMMAND 模式 & Active Object 模式
COMMAND 模式 command模式非常简单,简单到你无法想象的地方. public interface Command { void execute(); } 这就是一个command模式的样子 ...
随机推荐
- php设计模式学习之观察者模式
什么都不说,先看代码: interface userOperateImpl { public function operate($username); } class userLoginLog imp ...
- ios app打ipa包
在app上传到appstore之前,我们通常要经过打包测试的步骤,导出到testFlight中.或者其他第三方的平台里面进行测试,这时候就需要打包成ipa包导出.好了,废话不多说,上图.步骤如下: 1 ...
- java多线程学习-同步之线程通信
这个示例是网上烂大街的,子线程循环100次,主线程循环50次,但是我试了很多次,而且从网上找了很多示例,其实多运行几次,看输出结果并不正确.不知道是我转牛角尖了,还是怎么了.也没有大神问,好痛苦.现在 ...
- 屏蔽input导致的回车提交事件
onkeypress="if(event.keyCode == 13) return false;"
- JProfiler使用入门(一)——准备工作
JProfiler是一个全功能的Java剖析工具(profiler),主要用于检查和跟踪系统(限于Java开发的)的性能. JProfiler可以通过时时的监控系统的内存使用情况,随时监视垃圾回收 ...
- iscsi: 环境搭建
组网环境 +----------+---------------+---------------+ | hostname | ip address | iscsi role | +---------- ...
- 2016 小马哥 IOS
2016 小马哥 IOS 最新视频完整版 链接:http://pan.baidu.com/s/1c1EQlBM 密码:mxkt
- iOS圆形图片裁剪,以及原型图片外面加一个圆环
废话不多说,直接上代码 #import "ViewController.h" @interface ViewController () @property (nonatomic,s ...
- 【树上莫队】【带修莫队】【权值分块】bzoj4129 Haruna’s Breakfast
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using ...
- asp.net写验证码
生成验证码与匹配验证码的服务端代码 <%@ WebHandler Language="C#" Class="ValidataeCodeHandler" % ...