网站首页 > 博客文章 正文
访问者(Visitor)模式,是一种行为设计模式, 它能将某对象结构中的各元素对象的业务操作与其所作用的对象隔离开来,可以在不改变各元素的情况下,增加新操作。
访问者模式有两个重要前提:
- 针对的是某种数据结构中的元素集合。
- 增加新操作,这个操作并非原来元素的主要业务。
可以是面对一个复杂对象结构,不想去直接修改元素本身。也可以是把元素中非主要的行为抽取到访问者中去。
访问者模式实现
访问者模式主要是附加一组访问者来承接新的业务操作。主要角色有:
- 抽象访问者(Visitor)角色:定义每个具体元素的访问接口visit(ElementA),参数为具体元素。
- 具体访问者(Concrete Visitor)角色:实现抽象访问者角色中声明的各个访问操作,并实现具体的业务操作。
- 抽象元素(Element)角色:声明带accept(Visitor) 的接口,参数是一个访问者,表明接受新的业务操作。
- 具体元素(Concrete Element)角色:实现抽象元素角色提供的 accept() 操作,其方法体通常都是 visitor.visit(this) ,另外具体元素中可能还包含本身业务逻辑的相关操作。
- 对象结构(Object Structure)角色:是一个包含元素角色的容器。
类图如下:
代码如下:
//抽象访问者
interface Visitor {
void visit(ConcreteElementA element);
void visit(ConcreteElementB element);
}
//具体访问者A、B...
class ConcreteVisitorA implements Visitor {
public void visit(ConcreteElementA element) {
//元素A上,新加的业务操作
}
public void visit(ConcreteElementB element) {
//元素B上,新加的业务操作
}
}
//抽象元素类
interface Element {
void accept(Visitor visitor);
}
//具体元素A、B...
class ConcreteElementA implements Element {
//接收新功能
public void accept(Visitor visitor) {
visitor.visit(this);
}
//正常的业务操作...
}
//对象结构角色
class ObjectStructure {
private List<Element> list = new ArrayList<Element>();
//为新的访问者开放新功能
public void accept(Visitor visitor) {
Iterator<Element> i = list.iterator();
while (i.hasNext()) {
((Element) i.next()).accept(visitor);
}
}
// list管理如:add、remove
}
//客户端使用
ObjectStructure os = new ObjectStructure();
os.add(new ConcreteElementA());
Visitor visitor = new ConcreteVisitorA();
//执行新功能
os.accept(visitor);
访问者模式的应用
访问者模式加新功能不用修改原元素,也可以把非主要的功能从原元素中隔离出来。但是新增元素时改动比较大了,违背开闭原则。而且元素还必须关联访问者,结构关系复杂。访问者中也必须知道具体的元素,和依赖倒置原则相违背。
访问者模式的使用条件较为苛刻,本身结构也较为复杂,因此在实际应用中使用频率不是特别高。
猜你喜欢
- 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 访问者模式的结构(访问者模式的结构是)
你 发表评论:
欢迎- 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)
本文暂时没有评论,来添加一个吧(●'◡'●)