Java23种设计模式-行为型模式之访问者模式

访问者模式(Visitor Pattern):主要用于解决对象结构中元素的行为操作问题。这种模式允许在不修改对象结构的情况下,为其添加新的操作。

主要角色:
访问者 (Visitor):定义了一个访问元素的接口,为每个需要被访问的元素类都提供一个访问方法,即在Visitor中定义了一组方法,每个方法对应一个具体元素类。
具体访问者 (ConcreteVisitor):实现Visitor接口,为每个访问操作提供实现,定义了对每一个元素的访问行为。
元素 (Element):定义了一个接受访问者的接口,即一个accept方法,它接受一个访问者对象作为参数。
具体元素 (ConcreteElement):实现Element接口的accept方法,将调用访问者对象的相应访问操作。
对象结构 (ObjectStructure):一个包含元素集合的类,它可以是集合对象,也可以是图中的节点集合,它提供了一个方法用来遍历元素集合,并且允许访问者访问它的元素。
优点:

1.使得添加新的操作变得容易,因为你可以添加新的访问者类而不需要修改现有元素类。

2.将有关元素操作的算法从元素类中分离出来,有助于保持元素类的简单性。
缺点:

1.使得元素类与访问者类耦合在一起,因为元素类需要知道访问者类的存在。

2.对于已有的元素类,你不能使用访问者模式,除非它们重新设计以支持访问者模式。

3.访问者模式增加了类的个数,可能会使得系统变得复杂。
适用场景:

1.当一个对象结构中的对象需要有多种不同的并且不相关的操作时。

2.当需要对一个对象结构添加新的操作,但是又希望不修改现有对象结构中的类时。

示例

java 复制代码
// 元素接口
interface Element {
    void accept(Visitor visitor);
}
// 具体元素
class ConcreteElement implements Element {
    private String elementName;

    public ConcreteElement(String elementName) {
        this.elementName = elementName;
    }

    public String getElementName() {
        return elementName;
    }

    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}
// 访问者接口
interface Visitor {
    void visit(ConcreteElement element);
}
// 具体访问者
class PrintVisitor implements Visitor {
    @Override
    public void visit(ConcreteElement element) {
        System.out.println(element.getElementName());
    }
}
// 对象结构
class ObjectStructure {
    private List<Element> elements;

    public ObjectStructure(List<Element> elements) {
        this.elements = elements;
    }

    public void displayElements() {
        for (Element element : elements) {
            element.accept(new PrintVisitor());
        }
    }
}
// 客户端
public class Client {
    public static void main(String[] args) {
        List<Element> elements =new ArrayList<>();
        elements.add(new ConcreteElement("Element1"));
        elements.add(new ConcreteElement("Element2"));

        ObjectStructure objectStructure = new ObjectStructure(elements);
        objectStructure.displayElements();
    }
}
相关推荐
workflower14 小时前
人形机器人灵巧手产业链
人工智能·设计模式·机器人·云计算·无人机
Java后端的Ai之路16 小时前
03、Python - 抽象工厂模式
开发语言·python·设计模式·抽象工厂模式·通用智慧
AI人工智能+电脑小能手21 小时前
大白话说Java设计模式-45-解释器模式(源码剖析篇)
java·设计模式·解释器模式·源码分析·pattern·spel·javacc
码匠许师傅1 天前
【设计模式精讲】4.单例模式(Singleton)
c++·单例模式·设计模式
雾削木1 天前
2026 编程领域热点知识速览:AI 辅助开发、设计模式实战与嵌入式高效迭代
人工智能·设计模式
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-42-访问者模式(业务实战篇)
java·spring·设计模式·访问者模式·asm·营销规则·数据结构与操作分离
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-43-访问者模式(源码剖析篇)
java·设计模式·访问者模式·源码分析·elementvisitor·asm classvisitor·spring spel
Michael_lcf3 天前
Agent设计模式:思考-行动-观察循环的本质与局限
设计模式·agent设计模式·agent设计模式的本质
丰锋ff3 天前
设计模式学习笔记
笔记·学习·设计模式
米啦啦.3 天前
设计模式/
观察者模式·单例模式·设计模式·工厂模式