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模式的样子 ...
随机推荐
- ios8以后,使用UIAlertViw时pop/push页面后,键盘闪一下的问题
代码为 UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"" message:@"感谢你对我们提出的意见或 ...
- gawk快速入门
基本定义: gawk 的主要功能是针对文本的每一行执行被指定的 actions. 命令格式: gawk option program file option: -F 指定的分隔符,默认的分隔符是空格, ...
- redis队列的实现
redis中文官网:http://www.redis.cn/ 关于redis队列的实现方式有两种: 1.生产者消费者模式. 2.发布者订阅者模式. 详解: 1.生产者消费者模式. 普通版本: 比如一个 ...
- DOM、JDOM、DOM4J的区别(转载)
DOM.JDOM.DOM4J的区别 分类: XML2012-06-11 20:47 5576人阅读 评论(6) 收藏 举报 文档xmlcollectionsjavaapi工作 dom是解析xml的底层 ...
- 关于java中线程休眠的另一种写法
编辑器加载中... 优先使用TimeUnit类中的sleep() TimeUnit是什么? TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的 ...
- XmlSerializer 对象的Xml序列化和反序列化,XMLROOT别名设置
这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中 ...
- 抓发请求&设置默认工程
反向代理:外网服务器接受来自Internet的请求,转发到内网服务器. iptables转发:只有root才能使用1024以下的端口,域名的默认端口为80,一般不会给开发者提供root密码的.一台优质 ...
- DHCP工作过程
第一步是客户机发出的DHCPDSCOVER广播消息在网络上查找DHCP服务器. 任何收到这个消息的DHCP服务器产生一个DHCPOFFER的广播信息,其中包含配置信息,诸如IP地址.租期和域名.如果在 ...
- php 和mysql httpd 简单网页的搭建
使用两台服务器 Centos 7 做 php和httpd和php-sql 服务的安装 CentOS 5 做php 和 mysql 的安装 1.搭建本地yum源 两台服务器 都是 2.关闭防火墙和s ...
- 【转】Fiddler的基本介绍
转:http://kb.cnblogs.com/page/130367/#basic Fiddler的官方网站: www.fiddler2.com Fiddler的官方帮助:http://docs. ...