专业的编程技术博客社区

网站首页 > 博客文章 正文

设计模式——访问者模式(访问者模式是如何交互的)

baijin 2024-10-01 07:31:44 博客文章 14 ℃ 0 评论

访问者模式详解

访问者模式(Visitor Pattern)是一种在不改变现有类层次结构的基础上,为类层次结构中的多个类添加新操作的行为型设计模式。这种模式将数据结构与作用于结构上的操作解耦合,使得算法或者行为可以独立变化。

主要角色:

  • Visitor:抽象访问者,声明所有可以访问的具体元素类的接口方法,每个接受访问的方法对应一个具体的元素类型。
  • ConcreteVisitor:具体访问者,实现了 Visitor 接口中的每一个 visit 方法,为每个元素类提供相应的操作。
  • Element:抽象元素,定义了一个接受访问者的 Accept 方法,声明了接受哪个访问者对象访问。
  • ConcreteElement:具体元素,实现了 Element 接口,提供 accept 方法的具体实现,调用访问者的相应 visit 方法。

场景与优点:

  • 当需要为一组相似的对象结构增加新的操作而不想改动原有的结构时,访问者模式特别有用。
  • 可以将相关的操作集中到一个访问者类中,而不是分散在各个元素类中,便于维护和扩展。
  • 避免了对元素类的继承污染,因为新的操作可以通过增加新的访问者类来完成。

C++ 示例代码说明: 假设我们有一个简单的元素类层次结构,包括 Element 抽象基类以及两个派生类 ConcreteElementA 和 ConcreteElementB,我们要为这些元素设计不同的访问操作。

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

// 抽象访问者
class Visitor {
public:
    virtual void visit(ConcreteElementA& elementA) = 0;
    virtual void visit(ConcreteElementB& elementB) = 0;
};

// 具体元素A
class ConcreteElementA : public Element {
public:
    void accept(Visitor& visitor) override {
        visitor.visit(*this);
    }
    // 元素A的相关属性和方法
};

// 具体元素B
class ConcreteElementB : public Element {
public:
    void accept(Visitor& visitor) override {
        visitor.visit(*this);
    }
    // 元素B的相关属性和方法
};

// 具体访问者
class ConcreteVisitor : public Visitor {
public:
    void visit(ConcreteElementA& elementA) override {
        std::cout << "访问 ConcreteElementA 并执行特定操作..." << std::endl;
    }

    void visit(ConcreteElementB& elementB) override {
        std::cout << "访问 ConcreteElementB 并执行特定操作..." << std::endl;
    }
};

int main() {
    std::vector<std::unique_ptr<Element>> elements;
    elements.emplace_back(std::make_unique<ConcreteElementA>());
    elements.emplace_back(std::make_unique<ConcreteElementB>());

    ConcreteVisitor visitor;
    for (const auto& element : elements) {
        element->accept(visitor);  // 调用接受访问方法并传递访问者对象
    }

    return 0;
}

在这个例子中:

  1. Visitor 类声明了两个虚函数 visit,分别用于处理 ConcreteElementA 和 ConcreteElementB 类型的元素。
  2. ConcreteElementA 和 ConcreteElementB 类都从抽象 Element 类派生,并实现了 accept 方法,该方法负责调用传入访问者的相应 visit 函数。
  3. ConcreteVisitor 类实现了 Visitor 接口,并在 visit 方法中提供了针对不同元素类型的特定操作。

通过上述示例,当有新的元素类型加入时,只需在 Visitor 接口中添加新的 visit 方法,并创建对应的 ConcreteVisitor 子类来实现这个新方法;同时,新元素类型需要实现 Element 接口中的 accept 方法,即可使系统保持开放封闭原则(Open-Closed Principle)。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表