Visitor模式-数据主体需要稳定/相互关联三部分组成实现双分派或多分派

Visitor模式也是相互关联的,涉及到三个部分

    第一个部分是数据元素部分必须是一个稳定的结构,抽象出来的接口Accept方法是给ObjectStruct使用的,关联了访问者模式的抽象方法,不同的数据元素会调用访问者接口不同的方法(一般访问者是为数据元素定制的,也就是访问者进来访问,有多少个元素会产生多少个分派处理)

    第二部分访问者接口中的方法数量是对应数据元素的统一了接口,为了给数据元素调用且子类能够实现不同的操作,访问者子类会关联数据元素,是为了看是否要根据数据元素的状态进行操作限定。

    第三部分是对象结构部分,需要先将数据元素注册到对象结构里面,然后对象结构执行动作方法(以访问者作为参数传入),对象结构里面的数据元素会选择访问者不同的动作进行表现

Visitor模式UML:

Visitor模式-数据主体需要稳定/相互关联三部分组成实现双分派或多分派_第1张图片

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

 客户端调用代码:

    ObjectStructure os;
    os.attach(new ConcreteElementA());
    os.attach(new ConcreteElementB());
    ConcreteVisitorA v1;
    ConcreteVisitorA v2;
    os.accept(&v1);
    os.accept(&v2);

 
 

Visitor优缺点:

访问者模式的优点是在数据元素稳定情况下,操作变换频繁时候,变换操作变得很简单,易于维护修改和拓展。

缺点是尽管在数据元素稳定情况下,因为是相互关联的,如果访问者需要知道数据元素状态,那么就破坏了封装;当数据元素变化时候,那么将会导致紊乱。

与其它模式的关联:

  与Iterator模式,由于访问者模式需要对对象结构进行操作,而对象结构本身是一个元素对象的集合,因此访问者模式经常需要与迭代器模式联用,在对象结构中使用迭代器来遍历元素对象。
    与Composite模式,在访问者模式中,元素对象可能存在容器对象和叶子对象,因此可以结合组合模式来进行设计。

你可能感兴趣的:(Visitor模式-数据主体需要稳定/相互关联三部分组成实现双分派或多分派)