网站首页 > 博客文章 正文
访问者模式详解
访问者模式(Visitor Pattern)是一种在不改变现有类层次结构的基础上,为类层次结构中的多个类添加新操作的行为型设计模式。这种模式将数据结构与作用于结构上的操作解耦合,使得算法或者行为可以独立变化。
主要角色:
- Visitor:抽象访问者,声明所有可以访问的具体元素类的接口方法,每个接受访问的方法对应一个具体的元素类型。
- ConcreteVisitor:具体访问者,实现了 Visitor 接口中的每一个 visit 方法,为每个元素类提供相应的操作。
- Element:抽象元素,定义了一个接受访问者的 Accept 方法,声明了接受哪个访问者对象访问。
- ConcreteElement:具体元素,实现了 Element 接口,提供 accept 方法的具体实现,调用访问者的相应 visit 方法。
场景与优点:
- 当需要为一组相似的对象结构增加新的操作而不想改动原有的结构时,访问者模式特别有用。
- 可以将相关的操作集中到一个访问者类中,而不是分散在各个元素类中,便于维护和扩展。
- 避免了对元素类的继承污染,因为新的操作可以通过增加新的访问者类来完成。
C++ 示例代码说明: 假设我们有一个简单的元素类层次结构,包括 Element 抽象基类以及两个派生类 ConcreteElementA 和 ConcreteElementB,我们要为这些元素设计不同的访问操作。
// 前向声明
class ConcreteElementA;
class ConcreteElementB;
// 抽象访问者
class Visitor {
public:
virtual void visit(ConcreteElementA& elementA) = 0;
virtual void visit(ConcreteElementB& elementB) = 0;
};
// 具体元素A
class ConcreteElementA : public Element {
public:
void accept(Visitor& visitor) override {
visitor.visit(*this);
}
// 元素A的相关属性和方法
};
// 具体元素B
class ConcreteElementB : public Element {
public:
void accept(Visitor& visitor) override {
visitor.visit(*this);
}
// 元素B的相关属性和方法
};
// 具体访问者
class ConcreteVisitor : public Visitor {
public:
void visit(ConcreteElementA& elementA) override {
std::cout << "访问 ConcreteElementA 并执行特定操作..." << std::endl;
}
void visit(ConcreteElementB& elementB) override {
std::cout << "访问 ConcreteElementB 并执行特定操作..." << std::endl;
}
};
int main() {
std::vector<std::unique_ptr<Element>> elements;
elements.emplace_back(std::make_unique<ConcreteElementA>());
elements.emplace_back(std::make_unique<ConcreteElementB>());
ConcreteVisitor visitor;
for (const auto& element : elements) {
element->accept(visitor); // 调用接受访问方法并传递访问者对象
}
return 0;
}
在这个例子中:
- Visitor 类声明了两个虚函数 visit,分别用于处理 ConcreteElementA 和 ConcreteElementB 类型的元素。
- ConcreteElementA 和 ConcreteElementB 类都从抽象 Element 类派生,并实现了 accept 方法,该方法负责调用传入访问者的相应 visit 函数。
- ConcreteVisitor 类实现了 Visitor 接口,并在 visit 方法中提供了针对不同元素类型的特定操作。
通过上述示例,当有新的元素类型加入时,只需在 Visitor 接口中添加新的 visit 方法,并创建对应的 ConcreteVisitor 子类来实现这个新方法;同时,新元素类型需要实现 Element 接口中的 accept 方法,即可使系统保持开放封闭原则(Open-Closed Principle)。
- 上一篇: 何为访问者模式(访问者模式是如何交互的)
- 下一篇: Java设计模式(二十四):访问者模式
猜你喜欢
- 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)
本文暂时没有评论,来添加一个吧(●'◡'●)