《设计模式》-访问者模式

  访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。

  结构图:

  

  抽象访问者(Visitor):声明了一个或者多个访问操作,形成所有的具体元素角色必须实现的接口。

  具体访问者(ConcreteVisitor):实现抽象访问者角色所声明的接口,也就是抽象访问者锁声明的各个访问操作。

  抽线节点(Element):声明一个接收操作,接受一个访问者对象作为一个参量。

  具体节点(ConereteElement):实现了抽象元素所规定的接受操作。

  结构对象(ObiectStructure):有如下一些责任,可以遍历结构中的所有元素;如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素,如果需要,可以设计成一个复合对象或者一个聚集,如List。

  如果系统的数据结构是频繁变化的,则不适合使用访问者模式。

  访问者优点:

  1.访问者模式使得增加新的操作变得很容易。如果一些操作依赖于一个复杂的结构对象的话,那么一般而言,增加新的操作会很复杂。而使用访问者模式,增加新的操作就意味着增加一个新的访问者类,因此,变得很容易。

  2.访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中

  3.访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。迭代子只能访问属于同一个类型等级结构的成员对象,而不能访问属于不同等级结构的对象。访问者模式可以做到这一点。

  4.积累状态。每一个单独的访问者对象都集中了相关的行为,从而也就可以在访问的过程中将执行操作的状态积累在自己内部,而不是分散到很多的节点对象中。这是有益于系统维护的优点。

  访问者缺点:

  1.增加新的节点类变得很困难。每增加一个新的节点都意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作

  2.破坏封装。访问者模式要求访问者对象访问并调用每一个节点对象的操作,这隐含了一个对所有节点对象的要求:它们必须暴露一些自己的操作和内部状态。不然,访问者的访问就变得没有意义。由于访问者对象自己会积累访问操作所需的状态,从而使这些状态不再存储在节点对象中,这也是破坏封装的。

  总结:这个访问者看得有点云里雾里啊。。。相当痛苦啊。。总纲上说,访问者模式适用于数据结构相对未定的系统,这个设计模式的核心就是 把操作和数据元素分开了,然后通过一个结构进行调用,这个结构里面可以有一个list去存放所有的元素,然后 访问者就可以通过这个结构去访问到所有的元素。如果有新的操作的话 可以直接基础操作的基类进行扩展。如果有新的元素的话也可以继承元素基类进行扩展。

posted @ 2013-08-12 20:37  蜗牛散步  阅读(181)  评论(0编辑  收藏  举报