访问者模式 -- Visitor

2017-04-24 00:19:41   最后更新: 2017-04-24 00:19:41   访问数量:247




有时需要对一个系统中的各个节点提供各种操作,但是对于不同的节点却需要不同的操作

考虑一个编译器,我们需要对代码对象进行类型检查、代码优化、流程分析等等操作,对于变量对象、赋值语句对象等等我们都需要进行这些操作,但是却需要完全不同的实现,如果把这些同样的操作分散到不同的类中,那么整个系统将会显得很难理解与维护,而且如果需要增加新的操作就必须重新改造和编译所有的类

访问者模式就解决了这个问题,他将所有的操作都封装到一个类中,这个类就是 Visitor 类,当一个元素接收到该访问时,他就向访问者发送相应的请求,并将自身信息作为参数传递

 

综上所述,使用 Visitor 模式的场景必须有两个层次

  1. 请求实际需要操作的元素
  2. 定义对元素操作的访问者

 

通常,在以下场景下适合使用 Visitor 模式:

  1. 一个对象结构包含很多类对象,你需要对这些对象中的某些对象添加一些依赖于具体对象的操作
  2. 希望为一个系统中的某些元素定义一些操作,但是不希望污染这些对象的类
  3. 对象结构已经定义很少被改变,但经常需要在此结构上定义新的操作

 

 

 

如上图所示,访问者模式主要由以下组件构成:

  • Visitor -- 为该对象结构中的每一个 ConcreteElement 类声明一个 Visit 操作,从而实现对对应对象的操作
  • ConcreteVisitor -- Visitor 类的实现类,实现一个算法中一系列作用于各 ConcreteElement 类的操作
  • Element -- 通过调用访问者实现一个 accept 操作
  • ObjectStructure -- 通常是结构中所有元素的集合,用来枚举整个结构中的各个元素,可以提供一个供访问者访问他的元素的接口

 

调用 Visitor 中操作的客户端必须先创建一个 ConcreteVisitor,然后通过 ObjectStructure 遍历结构,通过取出的 ConcreteElement 类,通过传入 ConcreteElement 对象执行他们的 accept 方法,从而实现相应的操作

 

优点

  1. 在不改变整个系统对象结构的条件下,为每个对象添加新的操作,而无需修改结构中的每一个类
  2. 操作集中于具体的 Visitor 中,而不是分散在结构中,从而简化了算法的实现
  3. 添加和修改操作变得容易

 

缺点

  1. 整个系统对象结构的变动会变得很困难
  2. 对象的封装被打破,通过一个类的定义无法了解它所具有的所有操作,从而让系统难以被理解
  3. 增加新的 ConcreteElement 将变得很困难,这会让 Visitor 的类层次难以维护,因为必须为每个 ConcreteVisitor 都添加相应类的操作,解决这个问题的一个方法是在 Visitor 中为方法添加默认操作

 

ObjectStructor 可以通过集合实现,通常需要元素的遍历操作,可以通过语言中的循环或 Iterator 模式实现

迭代器模式 -- Iterator

 

访问者也可以用于对一个由 Composite 模式定义的对象结构进行操作

组合模式 -- Composite

 

在 Interpret 模式中,抽象语法树可以通过结合 Visitor 模式实现文法的解释

解释器模式 -- Interpret

 






读书笔记      技术帖      龙潭书斋      设计模式      design pattern      行为模式      visitor      访问者模式      访问者     


京ICP备15018585号