【设计模式】字节三面:请举例阐释访问者模式

今天我们要一起探讨的主题是一种设计模式------访问者模式(Visitor Pattern)。我将从最基础的概念、应用场景,再到实例代码的展示,全方位的为大家剖析访问者模式。而且,我保证,你即使是编程新手,也能理解并开始应用这个设计模式!

首先,让我们先看一眼访问者模式的定义:

"访问者模式是一种将数据操作与数据结构分离的设计模式,它允许在不改变数据结构的情况下添加新的操作。"

你可能会觉得这个定义含混不清,不过别担心!接下来我们将通过一个有趣的例子来了解什么是访问者模式,以及它的作用。

乐园游客与乐园设施

想象一个场景:你是一位乐园的游客,乐园中有各种各样的设施,像过山车、旋转木马、摩天轮等等。作为游客,你可以选择你喜欢的设施进行游玩

在这个例子中,游客就像是"访问者" ,他在乐园中游玩,享受各种设施;而乐园的设施则像是数据结构 ,它们存在着,等待游客的到来。游客游玩各种设施就像是操作数据结构的过程。过山车、旋转木马、摩天轮等设施天生就有自己的结构,如何去玩它们(如乘坐、体验刺激等)并不会改变它们固有的结构,这就表现出访问者模式的特性---操作与结构分离

这个例子虽然简单,但是足以让我们对访问者模式有个直观的理解。在这个模式下,数据结构开放访问但是本身并不会进行数据操作,所有的数据操作由访问者完成

Java例子

假设我们正在为这个乐园编写管理程序。乐园中的设施我们定义抽象基类为Attract,并让不同的设施如RollerCoaster(过山车)、MerryGoRound(旋转木马)和FerrisWheel(摩天轮)都继承它。每种设施我们都要定义一个accept方法,用于接收访问者。

java 复制代码
public abstract class Attract {
    public abstract void accept(Visitor visitor);
}

public class RollerCoaster extends Attract {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

public class MerryGoRound extends Attract {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

public class FerrisWheel extends Attract {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

然后,我们定义一个访问者接口Visitor,它有一系列的visit方法,分别与不同的设施对应。

java 复制代码
public interface Visitor {
    void visit(RollerCoaster rollerCoaster);
    void visit(MerryGoRound merryGoRound);
    void visit(FerrisWheel ferrisWheel);
}

最后,我们定义一个实际的访问者,游客Tourist。游客会根据他的兴趣和体力情况,选择不同的设施进行游玩。

java 复制代码
public class Tourist implements Visitor {
    @Override
    public void visit(RollerCoaster rollerCoaster) {
        // 游客去玩过山车
    }
    @Override
    public void visit(MerryGoRound merryGoRound) {
        // 游客去玩旋转木马
    }
    @Override
    public void visit(FerrisWheel ferrisWheel) {
        // 游客去玩摩天轮
    }
}

以上就是访问者模式在java中的一个应用示例,希望这个例子有助于你理解和掌握访问者模式。至此,我们就对访问者模式有了非常清晰的理解。它是一种让操作与数据结构分离的设计模式,使我们能在不改变数据结构的情况下添加新的操作。

记住,当你在设计一个系统的时候,如果看到操作经常变化但数据结构相对稳定,那么访问者模式可能就是一个非常好的设计选择

如果上面的内容对你有帮助,请点赞收藏哦,我会分享更多的经验~

相关推荐
better_liang2 分钟前
每日Java面试场景题知识点之-数据库与缓存的一致性
java·数据库·redis·面试·分布式系统·缓存一致性·cache aside
JAVA社区9 分钟前
Java高级全套教程(九)—— SpringCloud超详细实战详解
java·开发语言·后端·spring cloud·面试·职场和发展
学代码的真由酱24 分钟前
【自用】测开面试问题-Java
java·面试·职场和发展
阿狸猿41 分钟前
论软件设计模式及其应用
设计模式
罗超驿42 分钟前
10.滑动窗口解决:无重复字符的最长子串 | LeetCode 3 Java 题解
java·算法·leetcode·面试
海南java第二人1 小时前
ClickHouse 实际应用类面试通关:项目案例、生产踩坑与实战经验
clickhouse·面试·实际应用类
野生技术架构师1 小时前
2026最新Java面试1200题全解析:从基础到架构,覆盖所有技术栈(含答案)
java·面试·架构
workflower1 小时前
具身智能-三层结构
人工智能·设计模式·动态规划·软件工程·scrum
我爱cope1 小时前
【Agent智能体10 | 反思设计模式-AI数据分析的可视化实战】
人工智能·设计模式·数据分析
西安邮电大学1 小时前
Kafka如何避免重复消费
java·后端·其他·面试·kafka