【C++】访问者模式
目录
- 一、模式核心概念与结构
- 二、C++ 实现示例:文档模型的操作
- 三、访问者模式的关键特性
- 四、应用场景
- 五、访问者模式与其他设计模式的关系
- 六、C++ 标准库中的访问者模式应用
- 七、优缺点分析
- 八、实战案例:图形编辑器的操作
- 九、实现注意事项
- 如果这篇文章对你有所帮助,渴望获得你的一个点赞!
访问者模式(Visitor Pattern)是一种【行为型】设计模式,它允许在不改变对象结构的前提下,定义作用于这些对象元素的新操作。这种模式将算法与对象结构分离,通过 “双重分派” 机制实现对不同类型元素的差异化处理,特别适用于需要对复杂对象结构进行多种不相关操作的场景。
一、模式核心概念与结构
访问者模式包含五个核心角色:
- 抽象访问者(Visitor):定义对每个具体元素的访问操作接口。
- 具体访问者(Concrete Visitor):实现抽象访问者接口,提供具体的操作逻辑。
- 抽象元素(Element):定义接受访问者的接口(
accept
方法)。 - 具体元素(Concrete Element):实现接受访问者的接口,通常调用访问者的对应方法。
- 对象结构(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() << "<