十分钟学会一个设计模式---行为模式---访问者模式

106 阅读1分钟

一、介绍

要将数据结构与数据操作分离, 主要解决稳定的数据结构和易变的操作耦合问题

二、未使用设计模式

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);
}