登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
1
2
/ 2 页
下一页
返回列表
首页
›
业界区
›
安全
›
访问者模式
访问者模式
[ 复制链接 ]
扔飒
2025-5-30 10:37:16
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
访问者(Visitor)模式属于行为型模式的一种。
访问者模式主要用于
分离算法和对象结构
,从而在不修改原有对象的情况下
扩展
新的操作。它适用于数据结构相对稳定,而操作(行为)容易变化的场景。
访问者模式允许在不修改现有类的情况下,为类层次结构中的对象定义
新的操作
。
访问者模式通过将操作封装到一个独立的类(即访问者)中,使得对象结构与操作解耦。
访问者模式使用了一种名为
双分派
(在运行时根据两个对象的类型动态选择方法)的技巧。
Java标准库中的
FileVisitor
,就是使用的访问者模式。访问者模式的设计比较复杂。
访问者模式适用于以下场景:
数据结构相对稳定,但操作易变的系统(例如编译器、代码分析器)。
需要对对象结构进行不同操作,并且这些操作相对独立,例如报表生成、统计、数据转换。
访问者模式通常有以下组成部分:
Visitor(访问者):定义一个访问接口,为不同类型的元素提供不同的访问方法。
ConcreteVisitor(具体访问者):访问者的具体实现,具体执行操作。
Element(元素接口):定义一个 accept(Visitor v) 方法,允许 Visitor 访问自身。
ConcreteElement(具体元素):具体的对象结构,实现 Element 接口,并在 accept(Visitor v) 方法中进行调用。
ObjectStructure(对象结构,通常是元素的集合):维护一组 Element 对象,并提供 accept(Visitor v) 方法,让访问者访问所有的元素。
我们模拟一下访问者模式的实现。
1、定义访问者接口
// 访问者接口
interface Visitor {
void visit(ConcreteElementA elementA);
void visit(ConcreteElementB elementB);
}
复制代码
2、定义具体访问者
// 具体访问者1
class ConcreteVisitor1 implements Visitor {
@Override
public void visit(ConcreteElementA elementA) {
System.out.println("Visitor1 访问 " + elementA.getName());
}
@Override
public void visit(ConcreteElementB elementB) {
System.out.println("Visitor1 访问 " + elementB.getName());
}
}
// 具体访问者2
class ConcreteVisitor2 implements Visitor {
@Override
public void visit(ConcreteElementA elementA) {
System.out.println("Visitor2 访问 " + elementA.getName());
}
@Override
public void visit(ConcreteElementB elementB) {
System.out.println("Visitor2 访问 " + elementB.getName());
}
}
复制代码
3、定义元素接口
// 元素接口
interface Element {
void accept(Visitor visitor);
}
复制代码
4、定义具体元素
// 具体元素 A
class ConcreteElementA implements Element {
private String name = "ElementA";
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String getName() {
return name;
}
}
// 具体元素 B
class ConcreteElementB implements Element {
private String name = "ElementB";
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String getName() {
return name;
}
}
复制代码
5、定义对象结构
// 对象结构,包含多个元素
class ObjectStructure {
private List<Element> elements = new ArrayList<>();
public void addElement(Element element) {
elements.add(element);
}
public void accept(Visitor visitor) {
for (Element element : elements) {
element.accept(visitor);
}
}
}
复制代码
6、测试访问者模式
public class VisitorPatternDemo {
public static void main(String[] args) {
ObjectStructure structure = new ObjectStructure();
// 添加元素
structure.addElement(new ConcreteElementA());
structure.addElement(new ConcreteElementB());
// 使用不同的访问者访问元素
Visitor visitor1 = new ConcreteVisitor1();
Visitor visitor2 = new ConcreteVisitor2();
System.out.println("使用 Visitor1 访问:");
structure.accept(visitor1);
System.out.println("\n使用 Visitor2 访问:");
structure.accept(visitor2);
}
}
复制代码
访问者模式的
优缺点
。
优点:
遵循开闭原则(OCP):可以在不修改元素类的情况下,为其添加新的操作。
将数据结构与行为分离:对象结构负责管理元素,而行为由访问者独立实现,增强了灵活性。
适用于复杂对象结构:当对象结构中包含不同类型的元素时,访问者模式可以统一管理操作逻辑。
缺点:
代码复杂度增加:对于简单对象结构,使用访问者模式可能会增加不必要的复杂性。
每次在元素层次结构中添加或移除一个类时,都要更新所有的访问者。
我们可以将访问者模式视为
命令
模式的
加强
版本,其对象可对不同类的多种对象执行操作。
至此23种设计模式暂告一个段落了。我们将开启下个篇章。
只有读不完的书,哪有不会走的人。-- 烟沙九洲
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
访问者
模式
相关帖子
《C# .net软件设计模式-----观察者模式》
《C# .net软件设计模式-----观察者模式》
四、装饰者模式
Claude Code 实战:从 Plan 模式到多 Agent 并行,NewsFlow 升级实录
这也行?按键动作模式识别也能用贝叶斯?
虾皮Shopee铺货模式怎么做?Shopee快速铺货选品技巧分享!
聚合系统设计:策略模式(Strategy Pattern)在银行通道对接场景中的应用
Kind 环境下 Flannel IPsec 模式跨节点通信故障排查流程
Kind 环境下 Flannel IPsec 模式跨节点通信故障排查流程
Cursor 四种交互模式
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
《C# .net软件设计模式-----观察者模式》
7
58
靳谷雪
2026-02-09
安全
《C# .net软件设计模式-----观察者模式》
7
68
琦谓
2026-02-09
安全
四、装饰者模式
4
59
后仲舒
2026-02-12
安全
Claude Code 实战:从 Plan 模式到多 Agent 并行,NewsFlow 升级实录
5
950
第璋胁
2026-02-17
业界
这也行?按键动作模式识别也能用贝叶斯?
5
362
章绮云
2026-02-18
安全
虾皮Shopee铺货模式怎么做?Shopee快速铺货选品技巧分享!
2
754
饮邺谲
2026-02-28
安全
聚合系统设计:策略模式(Strategy Pattern)在银行通道对接场景中的应用
4
320
呈步
2026-03-01
业界
Kind 环境下 Flannel IPsec 模式跨节点通信故障排查流程
1
32
官厌
2026-03-09
业界
Kind 环境下 Flannel IPsec 模式跨节点通信故障排查流程
0
34
公西颖初
2026-03-09
业界
Cursor 四种交互模式
0
1039
荦绅诵
2026-03-10
回复
(32)
拙因
2025-10-17 00:58:53
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
感谢分享,学习下。
梭净挟
2025-12-6 16:47:11
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
这个有用。
越蔓蔓
2025-12-11 15:00:21
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
不错,里面软件多更新就更好了
痨砖
2025-12-21 13:27:23
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
不错,里面软件多更新就更好了
丧血槌
2026-1-13 18:11:52
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
感谢分享
袁勤
2026-1-14 21:22:18
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
不错,里面软件多更新就更好了
痕伯
2026-1-18 18:44:13
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
分享、互助 让互联网精神温暖你我
湄圳啸
2026-1-18 23:47:39
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
感谢分享,学习下。
上官银柳
2026-1-21 07:40:26
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
前排留名,哈哈哈
珠尿娜
2026-1-21 15:52:07
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
分享、互助 让互联网精神温暖你我
轧岔
2026-1-24 08:59:32
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
谢谢楼主提供!
戈森莉
2026-1-25 08:37:57
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
谢谢楼主提供!
浦乐
2026-1-30 02:02:45
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
东西不错很实用谢谢分享
伏滢
2026-1-30 06:02:55
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
感谢,下载保存了
浦乐
2026-1-30 07:14:08
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
懂技术并乐意极积无私分享的人越来越少。珍惜
欧阳雪枫
2026-2-1 02:34:25
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
这个好,看起来很实用
移国拱
2026-2-2 04:59:39
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
这个有用。
锺冰洁
2026-2-3 08:30:21
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢分享,下载保存了,貌似很强大
赴忽
2026-2-3 09:32:36
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
感谢发布原创作品,程序园因你更精彩
下一页 »
1
2
/ 2 页
下一页
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
代码
业界
科技
签约作者
程序园优秀签约作者
发帖
扔飒
2026-2-3 09:32:36
关注
0
粉丝关注
25
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991125
anyue1937
9994892
kk14977
6845359
4
xiangqian
638210
5
神泱
9522
6
韶又彤
9916
7
宋子
9878
8
荪俗
9018
9
闰咄阅
9995
10
蓬森莉
9870
查看更多
今日好文热榜
857
使用小龙虾来操作猿编程的遥控车
399
图片防御与lvlm攻击论文阅读笔记
623
图片防御与lvlm攻击论文阅读笔记
118
二分查找力扣题(leetcode)
79
3分钟部署本地大模型,零成本实现 Token 自
197
Electron41+Vite8.0+DeepSeek桌面端AI助手|
675
OPUS编解码器在audio DSP上的移植和应用
471
SpringCloud进阶--Seata与分布式事务
989
大模型私有化部署指南:从“一键安装”到“
626
大模型私有化部署指南:从“一键安装”到“
886
SpringCloud进阶--Seata与分布式事务
172
SpringCloud进阶--Seata与分布式事务
786
Oracle SQL经典练习50题 | 附答案
206
gitru:一个由 Rust 打造的零依赖 Git 提交
930
gitru:一个由 Rust 打造的零依赖 Git 提交
267
gitru:一个由 Rust 打造的零依赖 Git 提交
856
gitru:一个由 Rust 打造的零依赖 Git 提交
427
gitru:一个由 Rust 打造的零依赖 Git 提交
694
ESP32S3 USB MSC 调试全过程记录
640
瑞芯微工业级芯加持,正点原子RK3562J开发