• Java设计模式之访问者模式


    访问者模式(Visitor Pattern)是一种行为型设计模式,它允许你在不修改对象结构的情况下定义新的操作。该模式将操作封装在称为访问者的对象中,访问者可以通过对象结构访问不同类型的元素,并对其执行特定的操作。

    访问者模式的核心思想是将数据结构和操作分离,使得新增操作变得容易,同时也符合开闭原则。它通过将操作封装在访问者对象中,让元素对象接受访问者对象的访问,并根据自身的类型调用访问者对象的相应方法。

    访问者模式包含以下角色:

    • 访问者(Visitor):定义了对每个元素对象的访问操作,通常为每个具体元素类都提供一个访问方法。
    • 具体访问者(ConcreteVisitor):实现了访问者接口,对元素对象进行具体的访问操作。
    • 元素(Element):定义了一个接受访问者对象的方法,通常是一个accept方法,该方法传入访问者对象作为参数。
    • 具体元素(ConcreteElement):实现了元素接口,实现了accept方法,将自身作为参数传给访问者对象的访问方法。
    • 对象结构(Object Structure):包含元素对象的集合,提供了一个高层接口,可以让访问者对象遍历集合中的元素。

    下面是一个简单的Java示例,演示了访问者模式的应用:

    // 访问者接口
    interface Visitor {
        void visit(ElementA element);
        void visit(ElementB element);
    }
    
    // 具体访问者实现
    class ConcreteVisitor implements Visitor {
        @Override
        void visit(ElementA element) {
            System.out.println("访问者访问元素A");
        }
        
        @Override
        void visit(ElementB element) {
            System.out.println("访问者访问元素B");
        }
    }
    
    // 元素接口
    interface Element {
        void accept(Visitor visitor);
    }
    
    // 具体元素实现
    class ElementA implements Element {
        @Override
        void accept(Visitor visitor) {
            visitor.visit(this);
        }
    }
    
    class ElementB implements Element {
        @Override
        void accept(Visitor visitor) {
            visitor.visit(this);
        }
    }
    
    // 对象结构
    class ObjectStructure {
        private List<Element> elements = new ArrayList<>();
        
        void addElement(Element element) {
            elements.add(element);
        }
        
        void accept(Visitor visitor) {
            for (Element element : elements) {
                element.accept(visitor);
            }
        }
    }
    
    // 示例代码
    public class VisitorPatternExample {
        public static void main(String[] args) {
            ObjectStructure objectStructure = new ObjectStructure();
            objectStructure.addElement(new ElementA());
            objectStructure.addElement(new ElementB());
            
            Visitor visitor = new ConcreteVisitor();
            objectStructure.accept(visitor);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    在上述示例中,访问者模式的核心是Visitor接口和Element接口。具体的访问者实现ConcreteVisitor定义了对元素的具体访问操作,而具体的元素实现ElementAElementB定义了接受访问者对象的方法accept,并将自身作为参数传给访问者对象的访问方法。ObjectStructure作为对象结构,用于存储元素对象的集合,并提供了一个接受访问者对象的方法accept,遍历集合中的元素并调用其accept方法。

    运行示例代码,输出结果为:

    访问者访问元素A
    访问者访问元素B
    
    • 1
    • 2

    这表明访问者对象成功地访问了元素对象,并根据元素对象的类型执行了相应的操作。这样,我们可以方便地添加新的访问者对象,而无需修改元素对象的结构。

  • 相关阅读:
    4 SpringMVC获取请求参数
    【硬核】把一个MOS管制作成开关电路
    Web基础与HTTP协议
    微服务效率工具 goctl 深度解析(上)
    【无标题】
    骑行运动耳机哪个好,列举五款适合在骑行过程中佩戴的耳机
    IDEA如何运行web程序
    day4驱动开发
    Java容器之迭代器和Collections
    Linux服务器线上优化
  • 原文地址:https://blog.csdn.net/kkwyting/article/details/133805512