这个概念我简单的描述一下:
假设我们拥有一个由不同种类的对象构成的对象结构,这些对象的类都拥有一个accept方法用来接受访问者对象;访问者是一个接口,他拥有一个visit方法,这个方法可以对访问到的对象结构中不同类型的元素做出不同的反应。
具体详细概念,可以在网上百度一下,我准备贴出例子,通过代码来阐述这个概念:
struct VideoFile;
struct TextFile;
struct Visitor {
virtual void visit(VideoFile&) = 0;
virtual void visit(TextFile&) = 0;
virtual ~Visitor() = default;
};
struct Elem {
virtual void accept(Visitor& visit) = 0;
virtual ~Elem() = default;
};
struct VideoFile : Elem {
void accept(Visitor& visit) {
visit.visit(*this);
}
};
struct TextFile : Elem {
void accept(Visitor& visit) {
visit.visit(*this);
}
};
Visitor就是一个访问者,他访问基于Elem的子类。子类通过访问者的接口函数将this传递给访问者。
为了防止大量出现accept函数的出现,以下使用模板进行了优化动作:
struct VideoFile;
struct TextFile;
struct Visitor {
virtual void visit(VideoFile&) = 0;
virtual void visit(TextFile&) = 0;
virtual ~Visitor() = default;
};
struct Elem {
virtual void accept(Visitor& visit) = 0;
virtual ~Elem() = default;
};
template<typename T>
struct AutoDis : Elem {
void accept(Visitor& vist) {
vist.visit(static_cast<T&>(*this));
}
};
struct VideoFile : AutoDis<VideoFile> {
};
struct TextFile : AutoDis<TextFile> {
};
这个模板体现的是一种奇异递归模板模式,