目录
访问者模式(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() << "<