网站首页 > 博客文章 正文
你好,我是程序员雪球。
今天我们来聊聊 23 种设计模式中,一种不常见行为型模式,访问者模式。聊聊它的设计思想、实现原理,应用场景,以及如何使用。
一、设计思想
访问者模式的主要思想是将数据结构与数据操作分离,使得数据结构可以相对稳定,而操作可以灵活地扩展和变化。它通过定义一个访问者接口,让不同的具体访问者实现对数据结构中元素的不同操作。
二、实现原理
访问者模式主要涉及以下几个角色:
1. 元素(Element):定义一个接受访问者访问的接口。
2. 具体元素(ConcreteElement):实现元素接口,提供具体的数据。
3. 访问者(Visitor):定义对元素进行操作的接口。
4. 具体访问者(ConcreteVisitor):实现访问者接口,提供具体的操作逻辑。
三、应用场景
1. 当需要对一个复杂的数据结构进行多种不同的操作,且这些操作彼此相对独立时。
2. 当需要在不改变数据结构的前提下,添加新的操作时。
四、Java 实现例子 - 员工信息统计
1. 员工接口
java 复制
interface Employee {
void accept(Visitor visitor);
}
2. 具体员工类
java 复制
class Engineer implements Employee {
private String name;
public Engineer(String name) {
this.name = name;
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String getName() {
return name;
}
}
java 复制
class Manager implements Employee {
private String name;
public Manager(String name) {
this.name = name;
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String getName() {
return name;
}
}
3. 访问者接口
java 复制
interface Visitor {
void visit(Engineer engineer);
void visit(Manager manager);
}
4. 具体访问者类 - 统计员工数量
java 复制
class EmployeeCounter implements Visitor {
private int engineerCount;
private int managerCount;
@Override
public void visit(Engineer engineer) {
engineerCount++;
}
@Override
public void visit(Manager manager) {
managerCount++;
}
public int getEngineerCount() {
return engineerCount;
}
public int getManagerCount() {
return managerCount;
}
}
5. 使用示例
java 复制
public class VisitorExample {
public static void main(String[] args) {
Employee engineer1 = new Engineer("张三");
Employee engineer2 = new Engineer("李四");
Employee manager1 = new Manager("王五");
EmployeeCounter counter = new EmployeeCounter();
engineer1.accept(counter);
engineer2.accept(counter);
manager1.accept(counter);
System.out.println("工程师数量: " + counter.getEngineerCount());
System.out.println("经理数量: " + counter.getManagerCount());
}
}
在这个例子中,我们通过访问者模式实现了对员工信息的统计,不同的访问者可以根据需要对员工数据进行不同的操作。访问者模式使得数据结构和操作的扩展性得到了很好的保障。
总结
一、设计思想
访问者模式的主要思想是将数据结构与数据操作分离。
二、实现原理
定义访问者类和元素类。
三、应用场景
1. 当需要对一个复杂的数据结构进行多种不同的操作,且这些操作彼此相对独立时。
2. 当需要在不改变数据结构的前提下,添加新的操作时。
讨论环节
为了方便你理解和巩固今天的内容,我给你留下两个讨论题,请在评论区与我一起讨论吧。
1. 访问者模式的核心设计思想是什么?
2. 请说说你用过访问者模式的场景?
如果觉得有收获,请双击支持,关注,后期我会持续更新更多相关知识。
- 上一篇: Aha!设计模式(107)-访问者模式(3)
- 下一篇: 设计模式(一)单例模式(单例设计模式的作用)
猜你喜欢
- 2024-10-01 设计模式——备忘录模式(备忘录界面设计)
- 2024-10-01 设计模式 之 行为型模式(行为型设计模式特点)
- 2024-10-01 Go语言设计模式-访问者(go语言有设计模式吗)
- 2024-10-01 Spring Boot 实战:运用访问者模式灵活扩展订单处理逻辑
- 2024-10-01 visitor pattern 访问者模式(访问者模式工作原理)
- 2024-10-01 Aha!设计模式(105)-访问者模式(1)
- 2024-10-01 GOF设计模式(命令模式,访问者模式,迭代器模式,观察者模式)
- 2024-10-01 设计模式第2招第9式之解释器模式(解释器原理)
- 2024-10-01 设计模式第2招第1式之观察者模式(观察者设计模式的优点)
- 2024-10-01 「编程设计」访问者(Visitor)模式-补丁式为原体系增加新功能
你 发表评论:
欢迎- 07-07Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- 07-07Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- 07-07Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- 07-07Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- 07-07IT运维必会的30个工具(it运维工具软件)
- 07-07开源项目有你需要的吗?(开源项目什么意思)
- 07-07自动化测试早就跑起来了,为什么测试管理还像在走路?
- 07-07Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- 最近发表
-
- Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- IT运维必会的30个工具(it运维工具软件)
- 开源项目有你需要的吗?(开源项目什么意思)
- 自动化测试早就跑起来了,为什么测试管理还像在走路?
- Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- Cursor 太贵?这套「Cline+OpenRouter+Deepseek+Trae」组合拳更香
- 为什么没人真的用好RAG,坑都在哪里? 谈谈RAG技术架构的演进方向
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)