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. ubuntu 12.04禁用笔记本触摸板

    习惯了在Macbook Pro上使用触摸板,装了个linux 的dualboot,发现,ubuntu下对触摸板的支持实在是太烂了,想禁用触摸板却找不到设置的地方. 终于最后发现了——touchpad- ...

  2. Android测试——adb命令

    Adb (Android Debug Bridge)起到调试桥的作用. 通过adb我们可以在Eclipse中方便通过DDMS来调试Android程序.adb采用监听Socket TCP 5554等端口 ...

  3. Java集合之TreeMap

    Map的单元是对键值对的处理,之前分析过的两种Map,HashMap和LinkedHashMap都是用哈希值去寻找我们想要的键值对,优点是由O(1)的查找速度. 那如果我们在一个对查找性能要求不那么高 ...

  4. SEO站长必备的十大常用搜索引擎高级指令

    作为一个seo人员,不懂得必要的搜索引擎高级指令,不是一个合格的seo.网站优化技术配合一些搜索引擎高级指令将使得优化工作变得简单.今日就和大家聊聊SEO站长必备的十大常用搜索引擎高级指令的那些事儿. ...

  5. 搭载hexo+github博客系统

    一.安装 Node.js 在官网 http://nodejs.org/ 下载winwos版本,点击安装完成即可. 二.git环境安装 对于git的安装,网上已经大量资料,就不赘述了. 三.安装 hex ...

  6. Visual Studio Professional 2015 key

    Visual Studio Professional 2015 Key : HMGNV-WCYXV-X7G9W-YCX63-B98R2 Visual Studio Enterprise 2015 Ke ...

  7. 20145225《Java程序设计》 第10周学习总结

    20145225<Java程序设计> 第10周学习总结 教材学习内容总结 一.网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据: 程序员所作的事情就是把数据发送到指定 ...

  8. jquery实现tab页切换显示div

    1.jQuery实现tab切换显示代码实现 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" &q ...

  9. 【JSP】自定义标签开发入门

    JSP 自定义标签 自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时We ...

  10. Unity5 如何做资源管理和增量更新

    工具 Unity 中的资源来源有三个途径:一个是Unity自动打包资源,一个是Resources,一个是AssetBundle. Unity自动打包资源是指在Unity场景中直接使用到的资源会随着场景 ...