《访问者模式(极简c++)》

发布于:2024-04-19 ⋅ 阅读:(25) ⋅ 点赞:(0)
        本文章属于专栏- 概述 - 《设计模式(极简c++版)》-CSDN博客

模式说明
  • 方案:将数据结构与数据操作分离,使得数据结构可以在不改变的情况下,添加新的操作。
  • 优点:增加新的操作易于扩展,符合开闭原则;将相关行为封装在一起,使得代码易于维护。
  • 缺点:增加新的数据结构需要修改所有的访问者类,可能引入依赖倒置问题。
本质思想数据类型A基本不变。但是对应的具体操作O会变化,把这些操作O抽象成一个类B。在类A要操作O的时候,传入类B,以触发动作
实践建议:并不常用。对大部分情况下,直接修改类中的操作接口就行,如果有类似操作,一般直接抽象一个操作类,和现有类组合就行。这样代码逻辑也会更易读
#include <iostream>

// Forward declaration of concrete bird classes
class Sparrow;
class Pigeon;

// Abstract base class for visitor
class BirdVisitor {
public:
    virtual void visit(Sparrow& sparrow) = 0;
    virtual void visit(Pigeon& pigeon) = 0;
};

// Concrete bird class: Sparrow
class Sparrow {
public:
    void accept(BirdVisitor& visitor) {
        visitor.visit(*this);
    }
};

// Concrete bird class: Pigeon
class Pigeon {
public:
    void accept(BirdVisitor& visitor) {
        visitor.visit(*this);
    }
};

// Concrete visitor class: PrintVisitor
class PrintVisitor : public BirdVisitor {
public:
    void visit(Sparrow& sparrow) override {
        std::cout << "Printing data for Sparrow" << std::endl;
    }

    void visit(Pigeon& pigeon) override {
        std::cout << "Printing data for Pigeon" << std::endl;
    }
};

int main() {
    Sparrow sparrow;
    Pigeon pigeon;
    PrintVisitor printVisitor;

    sparrow.accept(printVisitor); // Output: Printing data for Sparrow
    pigeon.accept(printVisitor); // Output: Printing data for Pigeon

    return 0;
}