《C++20设计模式》访问者模式
文章目录
- 一、前言
- 1、如何学好访问者模式,前提条件肯定是要知道`访问者模式是干什么的`。
- 2、访问者模式实现方式
- 二、经典访问者模式
- 1、UML类图
- 2、实现
- 三、使用std::variant和std::visit的实现访问者模式
- 1、UML类图
- 2、实现
一、前言
1、如何学好访问者模式,前提条件肯定是要知道访问者模式是干什么的。
扩展原有类族的功能(形象点来说就是系统升级),符合开闭原则,对一类代码都进行扩展
2、访问者模式实现方式
这里介绍两种,为什么是两种而不是一种呢?因为真的各有各的优点,很难取舍!🫠
- 经典访问者模式
- 使用std::variant和std::visit的实现访问者模式
相关代码可以在这里,如有帮助给个star!AidenYuanDev/design_patterns_in_modern_Cpp_20
二、经典访问者模式
类族每个类都添加accept()函数,传入自身this,调用访问者,然后经由访问者实现新功能。
1、UML类图
2、实现
#include #include using namespace std; class Cpu; class Memory; class Visitor { public: virtual void visit_cpu(const Cpu& cpu) const = 0; virtual void visit_memory(const Memory& memory) const = 0; }; class Computer { public: virtual void accept(const Visitor& visitor) const = 0; virtual void show() const = 0; }; class Cpu : public Computer { public: void accept(const Visitor& visitor) const override { visitor.visit_cpu(*this); } void show() const override { cout public: void accept(const Visitor& visitor) const override { visitor.visit_memory(*this); } void show() const override { cout public: void visit_cpu(const Cpu& cpu) const override { cpu.show(); cout memory.show(); cout auto cpu = make_unique public: void draw() const { std::cout public: void draw() const { std::cout public: void draw() const { std::cout public: void operator()(const Circle& c) const { c.draw(); } void operator()(const Square& s) const { s.draw(); } void operator()(const Triangle& t) const { t.draw(); } }; class AreaVisitor { public: double operator()(const Circle&) const { std::cout std::cout std::cout std::vectorCircle(), Square(), Triangle()}; // 使用 DrawVisitor std::cout std::visit(DrawVisitor(), shape); } // 使用 AreaVisitor std::cout double area = std::visit(AreaVisitor(), shape); std::cout
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。