模式说明
- 方案:将数据结构与数据操作分离,使得数据结构可以在不改变的情况下,添加新的操作。
- 优点:增加新的操作易于扩展,符合开闭原则;将相关行为封装在一起,使得代码易于维护。
- 缺点:增加新的数据结构需要修改所有的访问者类,可能引入依赖倒置问题。
本质思想:数据类型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;
}