访问者(Visitor Pattern)

访问者(Visitor Pattern),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

结构


参与者
Visitor
——为该对象结构中ConcreteElement的每一个类声明一个Visit操作。该操作的名字和特征标识了发送Visit请求给该访问者的那个类。这使得访问者可以确定正被访问元素的具体的类。这样访问者就可以通过该元素的特定接口直接访问它。
ConcreteVisitor
——实现每个由Visitor声明的操作。每个操作实现本算法的一部分,而该算法片断乃是对应于结构中对象的类。 ConcreteVisitor为该算法提供了上下文并存储它的局部状态。这一状态常常在遍历该结构的过程中累积结果。
Element
——定义一个Accept操作,它以一个访问者为参数。
ConcreteElement
——实现Accept操作,该操作以一个访问者为参数。
ObjectStructure
——能枚举它的元素。
——可以提供一个高层的接口以允许该访问者访问它的元素。
——可以是一个复合或是一个集合,如一个列表或一个无序集合。

协作
一个使用Visitor模式的客户必须创建一个ConcreteVisitor对象,然后遍历该对象结构,并用该访问者访问每一个元素。
当一个元素被访问时,它调用对应于它的类的Visitor操作。如果必要,该元素将自身作为这个操作的一个参数以便该访问者访问它的状态。
下面的交互框图说明了一个对象结构、一个访问者和两个元素之间的协作。


效果

访问者模式把数据结构和作用于结构上的操作进行解耦,使得操作集合可以相对自由的演化。有比较稳定的数据结构,又有易于变化的算法时,使用访问者模式就比较合适。
下面是访问者模式的一些优缺点:
1)访问者模式使得易于增加新的操作。
2)访问者集中相关的操作而分离无关的操作。
3)增加新的ConcreteElement类很困难。
4)通过类层次进行访问。
5)累积状态;破坏封装。

重点概念

双分派(Double-dispatch) 

参考:《设计模式》、《大话设计模式》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值