访问者模式(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 小时前
Java面试——算法
java·算法·面试
evans在进步3 小时前
LeetCode 64:最小路径和——Java 原地动态规划详解
java·leetcode·动态规划
凤山老林4 小时前
Spring Boot 3.x AOT 编译实战:从原理、踩坑到生产落地
java·spring boot·后端
博傅4 小时前
Spring 核心原理
java·后端·spring
yurenpai(27届找实习中)4 小时前
从零读懂 AI 智能客服(一):模块职责与 SSE 聊天链路(后端架构)
java·人工智能·架构·langchain4j
陈皮波比茶5 小时前
Swagger
java
小闫BI设源码5 小时前
Elasticsearch面试必看:如何让客户端精准选择节点高效执行请求?
java·elasticsearch·面试宝典·深入解析
摇滚侠5 小时前
《SpringBoot 3:入门与应用实战》第 5 章 使用 Spring Boot 阅读笔记 9
java·spring boot·笔记
进阶的小名6 小时前
Spring AI 2.0 探索:多 OpenAI-Compatible 模型接入,以及下一代 Session 记忆管理
java·人工智能·后端·gpt·spring·ai·chatgpt
yaoxin5211236 小时前
503. Java 反射 - 编写 ServiceFactory 类
java·开发语言·python