设计模式:visitor

拜访者模式(visitor)适用于对复杂结构体进行解析的场景。

所谓复杂结构体,是指包含多个子元素的对象,比如集合,树,图,或者组合对象……。结构体中的每个元素,包括结构体本身实现接口:

Element{

//element的信息属性,在此省略

//专门用于调用visitor的方法

void accept(visitor)

}

所谓解析,是指提取结构体中各个元素的相关信息,组合起来。解析器实现接口:

Visitor{

void accept(Element的具体子类);//因为不同的Element子类有不同的信息

}

 

对于client来说,按照如下模式调用:

visitor= new XXXVisitor;

Element e=从外界获得的实例;

e.accept( visitor )

visitor.getOutput();

-----------

为什么需要Visitor模式呢?

让我们考虑这样的情形,结构体是一个二叉树的结构体,如果不用visitor模式,那么Visitor的visit方法定义如下:

void visit( Element root){

if(root != null)

   accept(root);

if(root.right!=null) visit(root.right);

if(root.left!=null) visit(root.left);

}

这样的话,有两个问题:

  1. Element的内部结构遍历的方法在visitor中实现,如果还有另外一个visitor要实现这个功能,它也需要实现遍历方法,这是一种重复的逻辑;
  2. 如果element的内部结构调整了,visitor1 和visitor2都必须改变。

-----------

所以visitor模式就是采用参观者和被参观对象的角色变换,实现了结构体和解析逻辑的解耦合。他适用于对同一个结构体有多种解析方法的情形。

posted @ 2016-04-01 22:15  永远是学生  阅读(939)  评论(0编辑  收藏  举报