设计模式--访问者模式(Visitor Pattern)

访问者模式(Visitor Pattern)是一种行为型设计模式,它可以让你在不改变类的情况下,增加作用于一组对象上的新操作。

访问者模式主要包含以下几个角色:

  1. Visitor(访问者):这是一个接口,通常定义了一个visit方法,用于对一个具体元素进行操作。
  2. ConcreteVisitor(具体访问者):实现了Visitor接口的类。每一个具体访问者都包含了对每一种具体元素操作的实现。
  3. Element(元素):这是一个接口,通常定义了一个accept方法,用于接受一个访问者对象。
  4. ConcreteElement(具体元素):实现了Element接口的类。accept方法通常在这里实现,它调用访问者的visit方法进行相关操作。
  5. ObjectStructure(对象结构):这是一个包含元素集合的类,提供一个接口让访问者可以访问其元素。

访问者模式的主要优点是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。

其主要缺点是增加新的元素类很困难,因为每增加一个新的元素类,都需要在每一个访问者类中增加相应的操作。

以下是一个简单的C++实现的访问者模式(Visitor Pattern)示例:

c 复制代码
#include <iostream>

// 前向声明
class ConcreteElementA;
class ConcreteElementB;

// 抽象访问者
class Visitor {
public:
    virtual void visitConcreteElementA(ConcreteElementA* element) = 0;
    virtual void visitConcreteElementB(ConcreteElementB* element) = 0;
    virtual ~Visitor() {}
};

// 抽象元素
class Element {
public:
    virtual void accept(Visitor* visitor) = 0;
    virtual ~Element() {}
};

// 具体元素A
class ConcreteElementA : public Element {
public:
    void accept(Visitor* visitor) override {
        visitor->visitConcreteElementA(this);
    }
};

// 具体元素B
class ConcreteElementB : public Element {
public:
    void accept(Visitor* visitor) override {
        visitor->visitConcreteElementB(this);
    }
};

// 具体访问者
class ConcreteVisitor : public Visitor {
public:
    void visitConcreteElementA(ConcreteElementA* element) override {
        std::cout << "Visiting ConcreteElementA..." << std::endl;
    }

    void visitConcreteElementB(ConcreteElementB* element) override {
        std::cout << "Visiting ConcreteElementB..." << std::endl;
    }
};

int main() {
    ConcreteVisitor* visitor = new ConcreteVisitor();

    ConcreteElementA* elementA = new ConcreteElementA();
    elementA->accept(visitor);

    ConcreteElementB* elementB = new ConcreteElementB();
    elementB->accept(visitor);

    delete visitor;
    delete elementA;
    delete elementB;

    return 0;
}

在这个例子中,Visitor是抽象访问者,定义了visitConcreteElementA和visitConcreteElementB等接口。Element是抽象元素,定义了accept接口。ConcreteElementA和ConcreteElementB是具体元素,实现了accept接口。ConcreteVisitor是具体访问者,实现了visitConcreteElementA和visitConcreteElementB接口。

在accept接口中,元素会调用访问者的visit接口,并将自己作为参数传入。这样,访问者就可以根据元素的具体类型,来执行相应的操作。

相关推荐
鱼跃鹰飞6 小时前
设计模式系列:工厂模式
java·设计模式·系统架构
老蒋每日coding14 小时前
AI Agent 设计模式系列(十九)—— 评估和监控模式
人工智能·设计模式
会员果汁14 小时前
23.设计模式-解释器模式
设计模式·解释器模式
「QT(C++)开发工程师」1 天前
C++设计模式
开发语言·c++·设计模式
茶本无香1 天前
设计模式之七—装饰模式(Decorator Pattern)
java·设计模式·装饰器模式
漂洋过海的鱼儿1 天前
设计模式——EIT构型(三)
java·网络·设计模式
老蒋每日coding2 天前
AI Agent 设计模式系列(十八)—— 安全模式
人工智能·安全·设计模式
老蒋每日coding2 天前
AI Agent 设计模式系列(十六)—— 资源感知优化设计模式
人工智能·设计模式·langchain
老蒋每日coding2 天前
AI Agent 设计模式系列(十七)—— 推理设计模式
人工智能·设计模式
冷崖2 天前
桥模式-结构型
c++·设计模式