设计模式之访问者模式

参考博文:https://www.cnblogs.com/jiaoyiping/p/9769554.html   侵权删除

2019-06-28  11:22:29

访问者模式  Visitor

分派概念的介绍:(访问者模式中使用了双分派)

  静态分派:发生在编译时期,分派根据静态类型信息发生。例如,方法重载就是静态分派。

  动态分派:发生在运行时期,动态分派动态地置换掉某个方法。例如,抽象父类引用指向具体子类。

什么是访问者模式:封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。(即在不改变数据基本结构的前提下扩展功能)

适用性:对象结构稳定的前提下,扩展功能。

访问者模式最大的限制:要求对象结构稳定。(不然会导致Visitor抽象类变化,抽象类变化不符合设计原则)。

访问者模式的基本类图

访问者模式的基本成员

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

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

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

  具体节点(ConcreteElement)角色:结构对象中的具体单元,实现了抽象节点所规定的接受操作。

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

访问者模式的基本代码要点

  两次分派:第一次分派ConcreteElement,第二次分派ConcreteVisitor。

  扩展功能的方式,增加Visitor 子类。

访问者模式的基本代码:(参考博文)

public class Client {
    public static void main(String[] args) {
        //创建一个结构对象
        ObjectStructure os = new ObjectStructure();
        //给结构增加一个节点
        os.add(new NodeA());
        //给结构增加一个节点
        os.add(new NodeB());
      
        Visitor visitor = new VisitorA();   //创建一个访问者

        os.action(visitor); //两次分派; 先找到具体的Node对象,然后找到具体的visitor,然后执行具体visitor 中的代码
    }
}

  

原文地址:https://www.cnblogs.com/youzoulalala/p/11101797.html