【C++】访问者模式

发布于:2025-07-04 ⋅ 阅读:(17) ⋅ 点赞:(0)

访问者模式(Visitor Pattern)是一种【行为型】设计模式,它允许在不改变对象结构的前提下,定义作用于这些对象元素的新操作。这种模式将算法与对象结构分离,通过 “双重分派” 机制实现对不同类型元素的差异化处理,特别适用于需要对复杂对象结构进行多种不相关操作的场景。

一、模式核心概念与结构

访问者模式包含五个核心角色:

  1. 抽象访问者(Visitor):定义对每个具体元素的访问操作接口。
  2. 具体访问者(Concrete Visitor):实现抽象访问者接口,提供具体的操作逻辑。
  3. 抽象元素(Element):定义接受访问者的接口(accept方法)。
  4. 具体元素(Concrete Element):实现接受访问者的接口,通常调用访问者的对应方法。
  5. 对象结构(Object Structure):管理元素集合,提供遍历元素的方式。

二、C++ 实现示例:文档模型的操作

以下是一个文档模型的示例,演示如何使用访问者模式实现不同类型文档元素的操作:

#include <iostream>
#include <string>
#include <memory>
#include <vector>

// 前向声明
class Visitor;

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

// 具体元素:文本段落
class TextParagraph : public Element {
   
private:
    std::string text;

public:
    TextParagraph(const std::string& content) : text(content) {
   }
    
    std::string getText() const {
    return text; }
    
    void accept(Visitor& visitor) override;
};

// 具体元素:图片
class Image : public Element {
   
private:
    std::string url;
    int width;
    int height;

public:
    Image(const std::string& imgUrl, int w, int h) 
        : url(imgUrl), width(w), height(h) {
   }
    
    std::string getUrl() const {
    return url; }
    int getWidth() const {
    return width; }
    int getHeight() const {
    return height; }
    
    void accept(Visitor& visitor) override;
};

// 抽象访问者
class Visitor {
   
public:
    virtual ~Visitor() = default;
    virtual void visitTextParagraph(TextParagraph& paragraph) = 0;
    virtual void visitImage(Image& image) = 0;
};

// 具体访问者:HTML导出器
class HTMLExportVisitor : public Visitor {
   
public:
    void visitTextParagraph(TextParagraph& paragraph) override {
   
        std::cout << "<p>" << paragraph.getText() << "<

网站公告

今日签到

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