大话设计模式之访问者模式

发布于:2024-04-17 ⋅ 阅读:(25) ⋅ 点赞:(0)

访问者模式是一种行为设计模式,它允许你在不修改对象结构的前提下定义作用于这些对象结构元素的新操作。

在访问者模式中,有两个核心概念:

  1. 访问者(Visitor):定义了对对象结构中每个元素的访问操作。每个访问者都会实现对应于对象结构中每个类的访问方法,通过这些方法可以对对象结构中的元素进行不同的操作。

  2. 元素(Element):定义了接受访问者的接口,通常包含一个 accept 方法,该方法接受一个访问者作为参数,然后调用访问者的相应方法来执行操作。

通过访问者模式,可以在不改变元素的类的前提下,定义新的操作,以及对元素进行不同的操作组合。这种模式通常适用于对对象结构中的元素进行复杂操作的场景,例如编译器的语法树遍历、文档对象模型(DOM)的操作等。

#include <iostream>
#include <vector>

// 前向声明访问者类
class Visitor;

// 元素接口
class Element {
public:
    virtual void accept(Visitor& visitor) = 0;
};

// 具体元素类A
class ConcreteElementA : public Element {
public:
    void accept(Visitor& visitor) override;
    void operationA() {
        std::cout << "Operation A performed on ConcreteElementA" << std::endl;
    }
};

void ConcreteElementA::accept(Visitor& visitor) {
    visitor.visitConcreteElementA(*this);
}

// 具体元素类B
class ConcreteElementB : public Element {
public:
    void accept(Visitor& visitor) override;
    void operationB() {
        std::cout << "Operation B performed on ConcreteElementB" << std::endl;
    }
};

void ConcreteElementB::accept(Visitor& visitor) {
    visitor.visitConcreteElementB(*this);
}

// 访问者接口
class Visitor {
public:
    virtual void visitConcreteElementA(ConcreteElementA& elementA) = 0;
    virtual void visitConcreteElementB(ConcreteElementB& elementB) = 0;
};

// 具体访问者类
class ConcreteVisitor : public Visitor {
public:
    void visitConcreteElementA(ConcreteElementA& elementA) override {
        elementA.operationA();
    }

    void visitConcreteElementB(ConcreteElementB& elementB) override {
        elementB.operationB();
    }
};

int main() {
    // 创建具体元素对象
    ConcreteElementA elementA;
    ConcreteElementB elementB;

    // 创建访问者对象
    ConcreteVisitor visitor;

    // 对元素对象应用访问者
    elementA.accept(visitor);
    elementB.accept(visitor);

    return 0;
}

/*
在这个示例中,我们定义了两个具体元素类 ConcreteElementA 和 ConcreteElementB,
它们都实现了元素接口 Element 中的 accept 方法。
然后我们定义了访问者接口 Visitor,其中包含了对每种具体元素的访问方法。
最后,我们定义了一个具体访问者类 ConcreteVisitor,它实现了对具体元素的访问方法。

在 main 函数中,我们创建了具体元素对象 elementA 和 elementB,以及访问者对象 visitor。
然后我们通过调用元素对象的 accept 方法来应用访问者,从而执行相应的操作。
*/

觉得有帮助的话,打赏一下呗。。

           


网站公告

今日签到

点亮在社区的每一天
去签到