首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计形式读书笔记-访问者模式

2013-10-08 
设计模式读书笔记-----访问者模式生老病死乃常态,是我们每个人都逃脱不了的,所以进医院就是一件再平常不过

设计模式读书笔记-----访问者模式

       生老病死乃常态,是我们每个人都逃脱不了的,所以进医院就是一件再平常不过的事情了。在医院看病,你首先的挂号,然后找到主治医生,医生呢?先给你稍微检查下,然后就是各种处方单(什么验血、CD、B超等等,太坑了。。。。),再然后就给你一个处方单要你去拿药。拿药我们可以分为两步走,第一步,我们要去交钱,划价人员会根据你的处方单上面的药进行划价,交钱。第二步,去药房拿药,药房工作者同样根据你的处方单给你相对应的药。

设计形式读书笔记-访问者模式

       这里我们就划价和拿药两个步骤进行讨论。这里有三个类,处方单(药)、划价人员、药房工作者。同时划价人员和药房工作者都各自有一个动作:划价、拿药。这里进行最初步的设计如下:

        划价人员


       访问者模式主要包含如下几个角色:

        Vistor: 抽象访问者。为该对象结构中的ConcreteElement的每一个类声明的一个操作。 
        ConcreteVisitor: 具体访问者。实现Visitor申明的每一个操作,每一个操作实现算法的一部分。 
        Element: 抽象元素。定义一个Accept操作,它以一个访问者为参数。 
        ConcreteElement: 具体元素 。实现Accept操作。 
        ObjectStructure: 对象结构。能够枚举它的元素,可以提供一个高层的接口来允许访问者访问它的元素。

       在访问者模式中对象结构存储了不同类型的对象,以便不同的访问者来访问。从上面的UML结构图中我们可以看出,访问者模式主要分为两个层次结构,一个是访问者层次结构,提供了抽象访问者和具体访问者,主要用于什么一些操作。一个是元素层次结构,提供了抽象元素和具体元素,主要用于声明Accept操作。

       在访问者模式中相同的访问者可以以不同的方式访问不同的元素,所以在访问者模式中增加新的访问者无需修改现有代码,可扩展行强。

       同时在访问者模式用到了一种双分派的技术,所谓双分派技术就是在选择一个方法的时候,不仅仅要根据消息接收者(receiver)的运行时区别(Run time type),还要根据参数的运行时区别。在访问者模式中,客户端将具体状态当做参数传递给具体访问者,这里完成第一次分派,然后具体访问者作为参数的“具体状态”中的方法,同时也将自己this作为参数传递进去,这里就完成了第二次分派。双分派意味着得到的执行操作决定于请求的种类和接受者的类型。


       三、模式实现

       同样以上面在医院付费、取药为实例。在这个实例中划价员和药房工作者作为访问者,药品作为访问元素、处方单作为对象结构,所以整个UML结构图如下:

设计形式读书笔记-访问者模式

       抽象访问者:Visitor.java


       四、模式优缺点

       优点

          1、使得新增新的访问操作变得更加简单。

          2、能够使得用户在不修改现有类的层次结构下,定义该类层次结构的操作。

          3、将有关元素对象的访问行为集中到一个访问者对象中,而不是分散搞一个个的元素类中。

       缺点

          1、增加新的元素类很困难。在访问者模式中,每增加一个新的元素类都意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作,违背了“开闭原则”的要求。
           2、破坏封装。当采用访问者模式的时候,就会打破组合类的封装。

          3、比较难理解。貌似是最难的设计模式了。

       五、模式适用场景

       1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。

       2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类。

       六、模式总结

       1、访问者模式封装了对象结构元素之上的操作,使得新增元素的操作变得非常简单。所以它比较适用于那么对象结构很少变化的类。

       2、访问者模式中对象结构存储了不同类型的元素对象,以供不同访问者访问。



热点排行