C++设计模式 - 访问器模式(Visitor)
2022/3/25 20:22:45
本文主要是介绍C++设计模式 - 访问器模式(Visitor),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
行为变化模式
- 在组件的构建过程中,组件行为的变化经常导致组件本身剧烈的变化。“行为变化” 模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合。
典型模式
- Command
- Visitor
Visitor
动机( Motivation )
- 在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法) , 如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。
- 如何在不更改类层次结构的前提下,在运行时根据需要 透明地为类层次结构.上的各个类动态添加新的操作,从而避免,上述问题?
模式定义
表示一个作用于某对象结构中的各元素的操作。使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作(变化)。
结构
要点总结
- Visito:模式通过所谓双重分发(double dispath )来实现在不更改,(不添加新的操作-编译时)Elemen类层次结构的前提下在运行时透明地为类层次结构上的各个类动态添和新的操作(支持变化)。
- 所谓双重分发即Visitor模式中间包括了两个多态分发(注意其中的多态机制):第一个为accept方法的多态 辨析;第二个为visitElementX方法的多态辨析
- Visito模式最大缺点在于扩展类层次结构(增添新的Element子类)会导致Visito类的改变。因此Visito模式适用于Element类层次结构稳定,而其中的操作却经常面临频繁改动。
cpp
#include<iostream> using namespace std; class Visitor; class Element { public: virtual void accept(Visitor& visitor) = 0;//第一次多态辨析(找accept) virtual ~Element() {} }; class ElementA :public Element { public: virtual void accept(Visitor& visitor) override; //第二次多态辨析(找visitElementA) }; class ElementB :public Element { public: void accept(Visitor& visitor) override; }; class Visitor { public: virtual void visitElementA(ElementA& element) = 0; virtual void visitElementB(ElementB& element) = 0; virtual ~Visitor() {} }; void ElementA::accept(Visitor& visitor) { visitor.visitElementA(*this);//第二次多态辨析(找visitElementA) } void ElementB::accept(Visitor& visitor) { visitor.visitElementB(*this); } //================= //对行为进行更改 class Visiter1 :public Visitor { public: void visitElementA(ElementA& element) override { cout << "Visitor1 process ElementA" << endl; } void visitElementB(ElementB& element) override { cout << "Visitor1 process ElementB" << endl; } }; class Visiter2 :public Visitor { public: void visitElementA(ElementA& element) override { cout << "Visitor2 process ElementA" << endl; } void visitElementB(ElementB& element) override { cout << "Visitor2 process ElementB" << endl; } }; int main() { Visiter1 visitor; ElementA elementA; elementA.accept(visitor);//二次多态辨析 ElementB elementB; elementB.accept(visitor); return 0; }
这篇关于C++设计模式 - 访问器模式(Visitor)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升
- 2024-05-08代码报错不用愁,CodeGeeX一键完成代码修复、错误解释的功能上线了!
- 2024-05-08今天开始程序员不用再发愁写commit message了,全部由CodeGeeX自动完成!