一、介绍
要将数据结构与数据操作分离, 主要解决稳定的数据结构和易变的操作耦合问题
二、未使用设计模式
class Element {
public:
virtual void Fun1() = 0;
virtual void Fun2() = 0;
// 如果增加Func3,不仅要修改基类,还要增加子类,需要将类中的数据结构,与易增加的操作进行分离
};
class ElementA : public Element {
public:
void Fun1() override{}
void Fun2() override{}
};
class ElementB : public Element {
public:
void Fun1() override{}
void Fun2() override{}
};
三、使用设计模式
class Element {
virtual void accept(Visitor &visitor) = 0;
};
class ElementA : public Element {
public:
void accept(Visitor &visitor) override {
visitor.visitElementA(*this);
}
};
class ElementB : public Element {
public:
void accept(Visitor &visitor) override {
visitor.visitElementB(*this);
}
};
class Visitor {
public:
// 适用于Element子类不变的情况,两个函数对应两个子类
virtual void visitElementA(ElementA *elementA) = 0;
virtual void visitElementB(ElementB *elementB) = 0;
};
// 要扩展的Fun3
class Visitor1 : public Visitor {
// 扩展的Fun3在ElementA中的实现
void visitElementA(ElementA *elementA) override {
cout << "Visitor1 ElementA" <<endl;
}
// 扩展的Fun3在ElementB中的实现
void visitElementB(ElementB *elementB) override {
cout << "Visitor1 ElementB" <<endl;
}
};
// 如果还有要扩展的数据操作 继承Visitor
int main() {
ElementB elementB;
Visitor1 visitor1;
elementB.accept(visitor1);
}