• 03-JAVA设计模式-访问者模式


    访问者模式

    什么是访问者模式

    访问者模式(Visitor Pattern)是软件设计模式中的一种行为模式,它用于将数据结构中的元素与操作这些元素的操作解耦。这种模式使得可以在不修改数据结构的情况下添加新的操作。

    在访问者模式中,我们定义了两个主要角色:

    • 访问者(Visitor): 这个接口声明了一个访问元素的方法,这个方法的名字和参数表示了访问操作。
    • 元素(Element): 这是一个定义了接受访问者(accept)方法的接口。这个方法的名字和参数表示了被访问的操作。
    • 具体元素(ConcreteElement): 实现元素接口,并存储数据。同时,它实现接受操作,通常是通过调用访问者的访问方法。
    • 具体访问者(ConcreteVisitor): 实现访问者接口,并定义了对特定元素的访问操作。
    • 对象结构(Object Structure): 通常包含元素的集合,并提供一个方法,使得访问者可以访问其元素。

    常见应用场景:

    • XML文档解析器设计
    • 编译器的设计
    • 复杂集合对象的处理

    访问者模式表示一个作用于某对象结构中的各个元素的操作,他是我们可以在不改变各个元素的类的前提下定义作用域这些元素的新操作。
    实际开发中应用范围非常窄。

    示例

    Element.java

    // 元素接口
    public interface Element {
        void accept(Visitor visitor);
    }
    
    • 1
    • 2
    • 3
    • 4

    Visitor.java

    // 访问者接口
    public interface Visitor {
        void visit(ConcreteElementA elementA);
    
        void visit(ConcreteElementB elementB);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    ConcreteElementA.java

    // 具体元素A
    public class ConcreteElementA implements Element {
    
        @Override
        public void accept(Visitor visitor) {
            visitor.visit(this);
        }
    
        public void operationA() {
            System.out.println("Element A: operationA()");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    ConcreteElementB.java

    // 具体元素B
    public class ConcreteElementB implements Element {
    
        @Override
        public void accept(Visitor visitor) {
            visitor.visit(this);
        }
        public void operationB() {
            System.out.println("Element B: operationB()");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    ConcreteVisitor.java

    // 具体访问者
    public class ConcreteVisitor  implements Visitor {
        @Override
        public void visit(ConcreteElementA elementA) {
            elementA.operationA();
            System.out.println("Visited Element A");
        }
    
        @Override
        public void visit(ConcreteElementB elementB) {
            elementB.operationB();
            System.out.println("Visited Element B");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    ObjectStructure.java

    import java.util.ArrayList;
    import java.util.List;
    
    // 对象结构
    public class ObjectStructure {
        private List<Element> elements = new ArrayList<>();
    
        public void attach(Element element) {
            elements.add(element);
        }
    
        public void detach(Element element) {
            elements.remove(element);
        }
    
        public void accept(Visitor visitor) {
            for (Element element : elements) {
                element.accept(visitor);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    TestClient.java

    // 测试
    public class TestClient {
        public static void main(String[] args) {
            ObjectStructure objectStructure = new ObjectStructure();
            objectStructure.attach(new ConcreteElementA());
            objectStructure.attach(new ConcreteElementB());
    
            ConcreteVisitor visitor = new ConcreteVisitor();
            objectStructure.accept(visitor);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    执行结果:

    在这里插入图片描述

    gitee源码

    git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

  • 相关阅读:
    使用 jQuery 来动态地设置 HTML 按钮的显示和隐藏
    【融云出海白皮书免费看】-巴西成增量潜力「应许之地」
    Day802.JVM热点问题 -Java 性能调优实战
    26-k8s的附加组件-图形化管理工具dashboard
    【练拳不练功,到老一场空】深入浅出计算机组成原理
    umi3使用
    梯度下降法 --- 吴恩达深度学习笔记
    基于googlenet网络的动物种类识别算法matlab仿真
    变化检测数据集制作详细版
    Python:dict
  • 原文地址:https://blog.csdn.net/u014331138/article/details/138171812