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模式的样子 ...
随机推荐
- JS之延迟处理
$(document).ready(function () { $("#zidong3,#zidong1").click(function () { $("#zidong ...
- 转贴 IT外企那点儿事完整版
转贴 IT外企那点儿事完整版 第一章:外企也就那么回儿事(http://www.cnblogs.com/forfuture1978/archive/2010/04/30/1725341.html) 1 ...
- 解除win7系统静音
#ifdef SPEAKERDEVMUTECONTROL# define SPEAKERDEVMUTECONTROL_EXPORT __declspec(dllexport)#else# define ...
- AngularJS学习--- AngularJS中模板链接和图像 ng-src step6
接上一篇文章,本文将主要介绍angularjs中的模板链接,和图像显示? 首先,切换分支,启动项目: git checkout step- npm start 1.效果 相较于前一篇文章,明显感觉多了 ...
- python学习之——小闹钟(持续完善ing)
"啊,坏了,我忘了那啥啥了~~~" 为了不坏了,动手做一个小闹钟吧,一点点完善的过程一定美好极了,必像等待培育许久的花儿绽放一样,不多说,加油,期待↖(^ω^)↗ #! /usr/ ...
- [z]vs中无法加入断点进行调试的解决方案
http://blog.chinaunix.net/uid-15464162-id-3799069.html [ 1] 以前也遇到过同样的问题,但没有问个为什么,也没有探个毕竟.昨天调试一个DLL,添 ...
- Google搜索质量评估员指南
Google: 此文档是我们(谷歌)的一份搜索质量评估员指南,可作为搜索质量评估员的培训材料.其中主要介绍了一类名为“网址评分”的评分任务,此类任务要求评估员查看搜索查询与可能返回的相应结果.他们需要 ...
- Awesome Machine Learning
https://github.com/josephmisiti/awesome-machine-learning 包含了很多的machine-learning开源的资源,包括各种语言的machin l ...
- GDI+技术
GDI+是GDI的后继者,它是一种构成 Windows XP 操作系统的子系统的应用程序编程接口. 一般来说有3种基本类型的绘图界面,分别为Windows 窗体上的控件.要发送给打印机的页面和内存中的 ...
- Linux-TFTP之用于网络远程安装
TFTP:Trival File Transfer Protocol,简单文件传输协议.是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂.开销不大的文件传输服务. ...