《C++20设计模式》访问者模式

07-16 1208阅读

文章目录

  • 一、前言
    • 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类图

            《C++20设计模式》访问者模式

            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 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]