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模式的样子 ...
随机推荐
- linux下mysql集群的安装
3台redhat服务器: SQL节点(mysqld): 192.168.1.77;192.168.1.78 数据节点(ndbd): 192.168.1.77;192.168.1.78 管理节点(ndb ...
- windbg符号
Symbol Server (Microsoft): srv*c:\mss*http://msdl.microsoft.com/download/symbols Symbol Server (Citr ...
- C++主要数据类型在计算机中所占字节大小
遇到了数据存储的大端和小端问题,这你妹的看的一头雾水,发现我基本知识严重匮乏啊,先了解C++各数据类型在自己机子上占多少字节吧,以及这些数据类型所占字节大小与神马有关.各种查资料然后写代码检验,小结于 ...
- hdu 5791 (DP) Two
hdu 5791 Two Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- Errors occurred during the build. Errors running builder 'JavaScript Validator' on project 'XXX'.
Errors occurred during the build. Errors running builder 'JavaScript Validator' on project 'XXX'. ...
- 根据显示的字符多少来做Label的自适应高度
根据显示的字符多少来做Label的自适应高度 UILabel *label = [[UILabel alloc]init]; NSString *string = @"其实,经年过往,每个人 ...
- uglifyjs压缩JS的
一.故事总有其背景 年末将至,很多闲适的时间,于是刷刷微博,接触各种纷杂的信息——美其名曰“学习”.运气不错,遇到了一个新名词,uglifyjs. 据说是用来压缩JS文件的,据说还能优化JS,据说是基 ...
- Apache+PHP配置运行环境(getenv的使用)
在开发与上线等多个环境下,常量的配置一般不同,例如开发环境和生产环境的一些域名肯定不一样,为了保证代码上线就能运行,要求在代码运行开始的时候对不同的环境区分这些常规变量. 找到Apache目录下虚拟主 ...
- pullToRefresh下拉刷新上拉加载
PullToRefresh 是一个第三方的工程. 之前的自定义下拉刷新控件貌似不太好用,于是网上找了这个. 参考:http://www.cnblogs.com/summers/p/4343964.ht ...
- 基于ticket的rw锁
代码: wiredtiger-2.8.0/src/os_posix/os_mtx_rw.c rw锁结构 struct { uint16_t writers; // Now serving for wr ...