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


    简介

    在软件开发领域中,设计模式是解决常见问题的经典方法。其中,访问者模式是一种强大且灵活的设计模式,用于处理对象结构中的元素,并根据不同的访问者实现不同的操作。

    访问者模式是一种行为型设计模式,它允许你在不改变元素类的前提下定义新的操作。该模式将算法封装在一个访问者对象中,通过访问者对象遍历对象结构,并对每个元素执行相应的操作。元素类不需要关心操作的细节,只需接受访问者的访问。

    与其他设计模式的区别

    1. 访问者模式 vs. 迭代器模式:
      • 迭代器模式用于遍历集合对象的元素,而访问者模式则用于对集合中的元素进行操作。
      • 迭代器模式将遍历逻辑封装在迭代器中,而访问者模式将操作逻辑封装在访问者中。
    2. 访问者模式 vs. 观察者模式:
      • 观察者模式用于实现对象间的一对多依赖关系,当一个对象发生改变时,其依赖的其他对象将得到通知。而访问者模式则注重对对象进行操作。
      • 观察者模式强调对象之间的松耦合,而访问者模式则将操作和对象结构紧密结合在一起。

    实现

    当使用访问者模式时,我们需要定义元素类、访问者接口、具体元素类、具体访问者类和对象结构。下面是使用Java语言实现访问者模式的示例代码:

    // 元素接口
    interface Element {
        void accept(Visitor visitor);
    }
    
    // 具体元素类A
    class ConcreteElementA implements Element {
        public void accept(Visitor visitor) {
            visitor.visitConcreteElementA(this);
        }
    
        public void operationA() {
            // 具体元素A的操作逻辑
        }
    }
    
    // 具体元素类B
    class ConcreteElementB implements Element {
        public void accept(Visitor visitor) {
            visitor.visitConcreteElementB(this);
        }
    
        public void operationB() {
            // 具体元素B的操作逻辑
        }
    }
    
    // 访问者接口
    interface Visitor {
        void visitConcreteElementA(ConcreteElementA elementA);
        void visitConcreteElementB(ConcreteElementB elementB);
    }
    
    // 具体访问者类
    class ConcreteVisitor implements Visitor {
        public void visitConcreteElementA(ConcreteElementA elementA) {
            // 具体访问者对元素A的操作逻辑
            elementA.operationA();
        }
    
        public void visitConcreteElementB(ConcreteElementB elementB) {
            // 具体访问者对元素B的操作逻辑
            elementB.operationB();
        }
    }
    
    // 对象结构类
    class ObjectStructure {
        private List<Element> elements = new ArrayList<>();
    
        public void addElement(Element element) {
            elements.add(element);
        }
    
        public void removeElement(Element element) {
            elements.remove(element);
        }
    
        public 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 ConcreteElementA());
            objectStructure.addElement(new ConcreteElementB());
    
            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
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77

    在上述示例代码中,我们定义了Element接口作为元素类的基础,具体的元素类ConcreteElementAConcreteElementB实现了该接口,并在accept()方法中调用访问者的对应方法。

    访问者接口Visitor定义了访问者的操作方法,具体访问者类ConcreteVisitor实现了该接口,并在每个方法中执行对应的操作逻辑。

    对象结构类ObjectStructure管理元素集合,并提供了添加、移除和接受访问者的方法。在accept()方法中,它遍历所有的元素,并调用每个元素的accept()方法,将访问者传递给元素。

    在示例用法中,我们创建了一个对象结构objectStructure,并向其中添加了具体元素A和元素B。然后,创建了一个具体访问者visitor,并通过调用accept()方法将访问者应用于对象结构中的元素。

    通过这种方式,访问者模式使得我们可以在不修改元素类的情况下,定义新的操作并应用于对象结构中的元素。

    优缺点

    优点

    1. 增加新的操作非常方便,只需要实现一个新的访问者。
    2. 将相关的行为集中在一个访问者对象中,使得代码更加易于维护和扩展。
    3. 对象结构可以稳定,无需修改,只需扩展新的访问者即可。

    缺点

    1. 添加新的元素类可能需要修改所有的访问者类,违反了开闭原则。
    2. 访问者模式增加了系统的复杂性,理解和实现可能会比较困难。

    运用场景

    1. 对象结构中的元素类固定,但需要根据不同的操作进行处理。
    2. 需要对一个对象结构中的元素进行多种不相关的操作,而又不希望这些操作污染元素类。
    3. 希望在不改变元素类的前提下,增加新的操作。

    总结

    访问者模式通过将操作封装在访问者对象中,使得对象结构和操作之间的耦合度降低,代码更易于维护和扩展。然而,访问者模式也会增加系统的复杂性。在实际应用中,我们需要根据具体的需求和设计目标来选择合适的设计模式,包括访问者模式在内。

    通过深入理解访问者模式的概念和实现,我们可以更好地应用它来解决复杂的设计问题,提高软件系统的灵活性和可扩展性。希望本文能为读者提供有关访问者模式的清晰理解,并在实际项目中发挥其价值。

  • 相关阅读:
    学科前沿讲座 文本分类TextClassfication
    四、【基础】组件实例三大核心属性之一 state
    Flutter高仿微信-视频演示
    Stable diffusion 用DeOldify给黑白照片、视频上色
    Java—hashCode、equals
    k8s--基础--23.2--认证-授权-准入控制--认证
    ElasticSearch (一)ElasticSearch 入门简介
    理解李彦宏的“不卷模型,卷应用”理念
    面试算法题(shell/日志数据查询统计)
    GPGGA NTRIP RTCM 笔记
  • 原文地址:https://blog.csdn.net/yucdsn/article/details/130907569