访问者模式(Visitor Pattern)

访问者模式(Visitor Pattern)

定义

访问者模式(Visitor Pattern)

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

该模式的主要思想是将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使得可以在不改变数据结构的前提下添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。

属于行为型模式。


适用场景

  1. 数据结构稳定,作用于数据结构的操作经常发生变化的场景;
  2. 需要数据结构与数据操作分离的场景;
  3. 需要对不同数据类型(元素)进行操作,而不使用分支判断具体类型的场景。

标准示例

  • Visitor(抽象访问者):定义一个访问具体元素的接口,该接口内部包含了对所有具体元素的访问方法。
  • ConcreteVisitor(具体访问者):实现Visitor接口,针对特定类型的元素执行具体访问操作。
  • Element(抽象元素):定义一个接受访问操作的接口,通常包含一个accept()方法,该方法接收一个访问者对象作为参数。
  • ConcreteElement(具体元素):实现了Element接口,存储了实际的数据,并提供接受访问者访问的方法实现。
  • ObjectStructure(对象结构):管理元素的集合,通常包含add、remove等方法以及一个遍历所有元素的accept()方法,该方法接收一个访问者对象作为参数,并遍历所有元素,让每个元素接受访问者的访问。

    代码:
java 复制代码
public interface IVisitor {
    void visit(ConcreteElementA element);
    void visit(ConcreteElementB element);
}
java 复制代码
public class ConcreteVisitorA implements IVisitor {

    public void visit(ConcreteElementA element) {
        String result = element.operationA();
        System.out.println( element.getClass().getSimpleName() + " : " + result);
    }

    public void visit(ConcreteElementB element) {
        int result = element.operationB();
        System.out.println( element.getClass().getSimpleName() + ": " + result);
    }
}
java 复制代码
public class ConcreteVisitorB implements IVisitor {

    public void visit(ConcreteElementA element) {
        String result = element.operationA();
        System.out.println(element.getClass().getSimpleName() + ": " + result);
    }
    public void visit(ConcreteElementB element) {
        int result = element.operationB();
        System.out.println( element.getClass().getSimpleName() + ": " + result);
    }
}
java 复制代码
public interface IElement {
    void accept(IVisitor visitor);
}
java 复制代码
public class ConcreteElementA implements IElement {

    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }

    public String operationA() {
        return this.getClass().getSimpleName();
    }

}
java 复制代码
public class ConcreteElementB implements IElement {

    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }

    public int operationB() {
        return new Random().nextInt(10);
    }
}
java 复制代码
public class ObjectStructure {
    private List<IElement> list = new ArrayList<IElement>();

    {
        this.list.add(new ConcreteElementA());
        this.list.add(new ConcreteElementB());
    }

    public void accept(IVisitor visitor) {
        for (IElement element : this.list) {
            element.accept(visitor);
        }
    }
}
java 复制代码
public class Test {

    public static void main(String[] args) {
        ObjectStructure objectStructure = new ObjectStructure();	
        IVisitor visitorA = new ConcreteVisitorA();
        objectStructure.accept(visitorA);
        System.out.println("***************************************");
        IVisitor visitorB = new ConcreteVisitorB();
        objectStructure.accept(visitorB);
    }

}

输出结果:

shell 复制代码
ConcreteElementA: ConcreteElementA
ConcreteElementB: 5
***************************************
ConcreteElementA: ConcreteElementA
ConcreteElementB: 4

以上就是访问者模式全部内容,感谢阅读!

相关推荐
\光辉岁月/几秒前
2.spring5-IOC
java·容器·ioc·注解
java_nnnn32 分钟前
Spring MVC小案例(1)
java·后端·spring·mvc
西凉的悲伤43 分钟前
Spring Boot 条件装配注解详解
java·springboot·1024程序员节·条件装配
木井巳1 小时前
【动态规划: 路径问题】不同路径
java·算法·leetcode·动态规划
打工仔折腾 AI1 小时前
AI Agent 工程化实战(二):5 分钟跑通 Deep Agent 并逐层拆解底层链路
java·数据库·人工智能·后端·python·langchain·ai agent 实战
秋名RG1 小时前
(二)存储、CPU 与指令执行——程序为什么快,又为什么慢
java·开发语言
BeiGuTing_code1 小时前
Java泛型与Object
java·开发语言
惊讶的猫1 小时前
Tika文档解析
java
HEJOO91 小时前
Java 类加载过程详解:从加载到初始化的完整链路
java·开发语言·firefox
科学熊1 小时前
Java 分布式理论与高并发编程
java·开发语言·分布式