Java与模式笔记(26)

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

访问者模式结构与角色

 

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

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

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

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

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

什么情况下不应当使用访问者模式

如果系统的数据结构是频繁变化的,则不适合使用访问模式。访问者模式提供了倾斜的可扩展性设计:方法集合的可扩展性和类集合的不可扩展性。

访问者模式的优点

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

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

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

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

访问者模式的缺点

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

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

当实现访问者模式时,要将尽可能多的对象浏览逻辑放在Visitor类中,而不是放在它的子类里。这样的话,ConcreteVisitor类对所访问的对象结构依赖较少,从而使维护较为容易。

访问者模式实现时谁负责遍历行为,可供选择的有

1、  有结构对象负责迭代是最常见的选择,者也就是需要结构对象角色的出发点。

2、  另一个解决方案是使用一个迭代对象来负责遍历行为。

3、  将遍历行为放到放着者中,此时可以省略结构对象。适用于遍历的逻辑较为复杂的情况。

访问者模式与缺省适配模式的联合使用:缺省适配模式为访问者模式增加一个层次的继承关系,从而可以利用这个机会为一个多态性的等级结构提供一个默认的实现。即VisitorAdapter实现Visitor,而VisitorAVisitorB继承VisitorAdapter。这种复合模式常常叫做适配器访问模式(Adapter Visitor Pattern)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值