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模式的用途.
    • 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类.
      • 可以使用Factory对象去创建Part对象并装入扩展对象.

[Agile Software Development(Principles,Patterns,and Pracitices)]

Visitor模式,Decorator模式,Extension Object模式的更多相关文章

  1. 浅谈设计模式--装饰者模式(Decorator Pattern)

    挖了设计模式这个坑,得继续填上.继续设计模式之路.这次讨论的模式,是 装饰者模式(Decorator Pattern) 装饰者模式,有时也叫包装者(Wrapper),主要用于静态或动态地为一个特定的对 ...

  2. Immutable Object模式

    多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线 ...

  3. Java多线程编程模式实战指南(二):Immutable Object模式

    多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线 ...

  4. Java多线程编程模式实战指南(二):Immutable Object模式--转载

    本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-immutable-o ...

  5. 设计模式之美:Extension Object(扩展对象)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用示例结构实现 Extension Object. 实现方式(二):使用泛型实现 IExtensibleObject<T ...

  6. 来杯咖啡-装饰者模式(Decorator)

    前言 上篇[观察者模式]发布已经近一个月了,个人感觉反应并不太理想,因为大家响应都不是很积极,不知是文章那里写得有问题,而且也没有人提出过有价值的改进建议,多少感觉有些失望L!因为工作繁忙,所以不可能 ...

  7. 七个结构模式之装饰者模式(Decorator Pattern)

    定义: 使用组合的方法,动态给一个类增加一些额外的功能,避免因为使用子类继承而导致类继承结构复杂.并且可以保持和被装饰者同一个抽象接口,从而使客户端透明. 结构图: Component:抽象构件类,定 ...

  8. 【C#|.NET】从细节出发(三) 逻辑层事务和page object模式

    一. 业务逻辑层的事务问题 如果你的程序分层清晰并且系统禁用复杂存储过程,那么在DA中的职责比较单一.程序的逻辑通过BLL调用各种不同模块的DA来实现数据操作.如果当需要不同模块在一个事务的时候,问题 ...

  9. 敏捷软件开发(3)---COMMAND 模式 & Active Object 模式

    COMMAND 模式 command模式非常简单,简单到你无法想象的地方. public interface Command { void execute(); } 这就是一个command模式的样子 ...

随机推荐

  1. JS打印页面

         打印 整个html页面(PS:样式要写在页面里面才能打印(就是用内部样式))             <a id="dayi" runat="server ...

  2. python的编码问题

    本文简单介绍了各种常用的字符编码的特点,并介绍了在python2.x中如何与编码问题作战 :) 请注意本文关于Python的内容仅适用于2.x,3.x中str和unicode有翻天覆地的变化,请查阅其 ...

  3. 友盟分享SDK集成步骤

    1.官方注册appID. 2.menifest添加和声明umeng相关的activity以及appKey. 3. // 首先声明一个controller变量,由友盟服务工厂类直接取得友盟社交服务. m ...

  4. SAP 打开账期

    1.先OB52修改账期: 如下界面开得公司9000下面 7.8月份的账期 2.mmpv 关闭上两个账期 3.mmrv 查看现在账期情况

  5. VS2010无法修改资源文件

    最近,因为公司开发的需要,对开发环境进行全面的升级,在这其中也遇到了不少问题,在之后将陆续整理出来,以便以后查看. 之前开发环境:VS2008,ArcGIS9.3,ArcEngine9.3,Oracl ...

  6. java多线程-Java中的Copy-On-Write容器

    Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改, ...

  7. mysql 基础语法

    以下为自己学习mysql 的一些笔记,以方便查询 目录 一. ALTER的 语法 二. 表的完整性约束 三. 索引的操作(mysql 数据库支持至少 16 个索引) 四. 视图的操作 五. 触发器的操 ...

  8. 关于 tomcat nio connector, servlet 3.0 async, spring mvc async 的关系

    tomcat 的 org.apache.coyote.http11.Http11NioProtocol Connector 是一个使用 Java NIO 实现的异步 accept 请求的 connec ...

  9. XHTML跟HTML的区别

    其实二者并没有什么区别,只是THTML的要求更加严格,比如说 1.XHTML 元素必须被正确地嵌套. 错误:<p><span>this is example.</p> ...

  10. Oracle 包(Package)

    引用这位大大的: http://www.cnblogs.com/lovemoon714/archive/2012/02/29/2373695.html 1.为什么要使用包?       答:在一个大型 ...