设计模式——访问者模式(Visitor)

devtools/2024/9/24 21:20:15/

访问者模式(Visitor Pattern)是一种将数据操作与数据结构分离的设计模式。这种模式适用于数据结构相对稳定,而操作算法经常改变的情况。访问者模式将数据结构(稳定的部分)中的元素(Element)的访问行为(变化的部分)封装在一个独立的访问者(Visitor)类中,使得可以在不修改数据结构的前提下增加新的操作。

访问者模式包含以下几个角色:

  1. Visitor(访问者):接口声明了一个或多个访问操作,每个操作对应数据结构中的一种可能元素类型。

  2. ConcreteVisitor(具体访问者):实现Visitor接口,为每个Element类提供一个访问操作实现,该操作会执行相应的业务逻辑。

  3. Element(元素):接口或抽象类,定义了一个接受访问者(accept)的方法,该方法通常以访问者作为参数。

  4. ConcreteElement(具体元素):实现了Element接口或继承了Element抽象类,实现了accept()方法,该方法通常调用访问者的访问操作并传入自己作为参数。

  5. ObjectStructure(对象结构):是元素的集合,它可以是组合模式的结构、数组或其他数据结构。它提供一种让访问者可以访问其所有元素的能力,如可以遍历所有元素并调用元素的accept()方法。

以下是访问者模式的一个简单Java代码示例:

// 访问者接口
public interface Visitor {void visit(ConcreteElementA element);void visit(ConcreteElementB element);
}// 具体访问者
public class ConcreteVisitor implements Visitor {@Overridepublic void visit(ConcreteElementA element) {System.out.println("Visiting ConcreteElementA: " + element.operationA());}@Overridepublic void visit(ConcreteElementB element) {System.out.println("Visiting ConcreteElementB: " + element.operationB());}
}// 元素接口
public interface Element {void accept(Visitor visitor);
}// 具体元素A
public class ConcreteElementA implements Element {@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}public String operationA() {return "ConcreteElementA";}
}// 具体元素B
public class ConcreteElementB implements Element {@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}public String operationB() {return "ConcreteElementB";}
}// 对象结构示例(这里使用简单的集合)
import java.util.ArrayList;
import java.util.List;public class ObjectStructure {private List<Element> elements = new ArrayList<>();public void attach(Element element) {elements.add(element);}public void detach(Element element) {elements.remove(element);}public void accept(Visitor visitor) {for (Element element : elements) {element.accept(visitor);}}
}// 客户端代码
public class Client {public static void main(String[] args) {ObjectStructure os = new ObjectStructure();os.attach(new ConcreteElementA());os.attach(new ConcreteElementB());Visitor visitor = new ConcreteVisitor();os.accept(visitor);}
}

在上面的示例中,ConcreteVisitor实现了Visitor接口,并为每种类型的Element提供了访问方法。ConcreteElementAConcreteElementB实现了Element接口,并实现了accept方法以接受访问者。ObjectStructure作为元素的集合,它允许访问者访问其所有元素。客户端代码创建了ObjectStructure实例,并添加了一些Element实例,然后创建了一个Visitor实例,并让ObjectStructure接受这个Visitor。这样,Visitor就能够访问所有的Element实例,并执行相应的操作。


http://www.ppmy.cn/devtools/39897.html

相关文章

蓝桥杯成绩已出

蓝桥杯的成绩早就已经出来了&#xff0c;虽然没有十分惊艳 &#xff0c;但是对于最终的结果我是心满意足的&#xff0c;感谢各位的陪伴&#xff0c;关于蓝桥杯的刷题笔记我已经坚持更新了49篇&#xff0c;但是现在即将会告别一段落&#xff0c;人生即将进入下一个规划。我们一起…

HTTPS对于网站到底价值几何?

现在HTTPS基本上已经是网站的标配了&#xff0c;很少会遇到单纯使用HTTP的网站。但是十年前这还是另一番景象&#xff0c;当时只有几家大型互联网公司的网站会使用HTTPS&#xff0c;大部分使用的都还是简单的HTTP&#xff0c;这一切是怎么发生的呢&#xff1f; 为什么要把网站…

设计模式:观察者模式

观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了对象之间的一对多依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都会得到通知并被自动更新。这种模式通常被用来实现事件处理系统、实时数据更新、…

QT day5 作业

服务器头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QList> //链表类 #include <QMessageBox> //消息对话框类 #include <QDebu…

【R语言与统计】SEM结构方程、生物群落、多元统计分析、回归及混合效应模型、贝叶斯、极值统计学、meta分析、copula、分位数回归、文献计量学

统计模型的七大类&#xff1a;一&#xff1a;多元回归 在研究变量之间的相互影响关系模型时候&#xff0c;用到这类方法&#xff0c;具体地说&#xff1a;其可以定量地描述某一现象和某些因素之间的函数关系&#xff0c;将各变量的已知值带入回归方程可以求出因变量的估计值&…

Bookends for Mac v15.0.2 文献书籍下载管理

Bookends Mac版可以轻松地将其导入参考 &#xff0c;并直接搜索和进口从数以百计的线上资料来源。Bookends Mac版使用内置在浏览器中下载参考与PDF格式的文件&#xff0c;或和/或网页的点击。 Bookends for Mac v15.0.2注册激活版下载 本文由 mdnice 多平台发布

AIGC、LLM 加持下的地图特征笔记内容生产系统架构设计

文章目录 背景构建自动化内容生产平台系统架构设计架构详细设计流程介绍笔记来源笔记抓取干预 笔记 AIGC 赋能笔记 Rule 改写笔记特征库构建 附录Bash Cron 定时任务Golang 与 Pyhon AIGC 实践 小结 背景 在大模型的浪潮下&#xff0c;ChatGPT、Sora、Gemini、文言一心 等新技…

Qt宏和关键字

Q_GADGET 这个宏是Q_OBJECT宏的弱化版本吧&#xff0c;不过它可以继续 使用属性机制、反射等特性&#xff0c;但是不能使用信号与槽QT_INCLUDE_COMPAT 兼容版本QT_BEGIN_NAMESPACE 防止命名污染Q_GUI_EXPORT 为了实现跨平台以及插件Q_FLAG(RenderHint)&#xff0c;Q_DECLARE_FL…