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. Light OJ 1026 - Critical Links (图论-双向图tarjan求割边,桥)

    题目大意:双向联通图, 现在求减少任意一边使图的联通性改变,按照起点从小到大列出所有这样的边 解题思路:双向边模版题 tarjan算法 代码如下: #include<bits/stdc++.h& ...

  2. ios9 http请求不能使用

    为了跟新新版本的ios9版本,使用http请求时会碰到无法加载数据的情况 App Transport Security has blocked a cleartext HTTP (http://) r ...

  3. [转]AS3复制可视对象

    一,复制舞台上的影片剪 方法1——反射方法: var ClassRef:Class = getDefinitionByName(getQualifiedClassName(t_mc)) as Clas ...

  4. SAP 禁止某个库位的货物移动

    SAP 禁止某个库位的货物移动 1.先去spro --> 物料管理 --> 库存管理和实际库存 --> 权限管理 --> 授权检查存储位置 将要禁止的库位后的权限勾选上, 2. ...

  5. snmp switch traffic交换机带宽

    上代码 <?php function getstr1($strall,$str1,$str2,$html_charset='utf-8'){ $i1=mb_strpos($strall,$str ...

  6. Eclipse+Mingw+Boost 环境搭建

    一.安装CDT插件 Eclipse是用Java的swt开发的,所以需要java虚拟机才能运行,jdk的配置方法网上一大堆,这里就不细说了.安装CDT的方法简单提一下,到Help->Eclipse ...

  7. 记录一个多核CPU负载不均衡问题(动态绑定进程到指定cpu:taskset -pc $CPU $PID)

    昨晚和一位读者朋友讨论了一个问题:在一台多核 CPU 的 Web 服务器上,存在负载不均衡问题,其中 CPU0 的负载明显高于其它 CPUx,进一步调查表明 PHP-FPM 的嫌疑很大.话说以前我曾经 ...

  8. centos6搭建VPN

    1,检查是否开启PPP #cat /dev/ppp cat: /dev/ppp: No such device or address //表示已经开启 2,安装ppp和iptables #yum in ...

  9. hp小机定位网卡位置

    rad已经被olrad取代 HPUX下定位网卡位置                                                   一台HP小型机,可能配了多块网卡,在系统中以la ...

  10. Mysql基础2

    一.DQL下查询英语分数在 80-90之间的同学.mysql>SELECT * FROM student WHERE english>=80 AND english<=90;或者my ...