訪问者设计模式的实现借助于两个继承体系,
- (1)elements:一个是被操作的类(基类及其子类)
- (2)visitors:一个定义了一系列操作的訪问者(基类及其子类)
訪问者模式是一种行为型设计模式(behavioral design pattern),被用于为一个树形结构(Node、LeafNode、InternalNode)中的 elements 添加操作。使用訪问者设计模式,我们不需在 elements 类内部编写相关成员函数实现功能,而是将操作定义在另外的一个类的继承体系中,也即 Visitors。(实现了一种分离?)
class LeafNode;class InternalNode;class Visitor{public: virtual ~Visitor(){} virtual void visit(const LeafNode&) = 0; virtual void visit(const InternalNode&) = 0;};class PrintVisitor:public Visitor{public: void visit(const LeafNode&) { cout << "visiting a leafnode " << endl; } void visit(const InternalNode&) { cout << "visiting an internal node" << endl; }};class Node{public: virtual ~Node(){} virtual void accept(Visitor& v) = 0;};class LeafNode:public Node{public: void accept(Visitor& v) { v.visit(*this); }};class InternalNode :public Node{public: void accept(Visitor& v) { v.visit(*this); for (const auto& elem : _data) elem->accept(v); } void add(Node* pn) { _data.push_back(pn); }private: vector_data;};
client代码:
LeafNode lna;LeafNode lnb;LeafNode lnc;InternalNode in1;InternalNode in2;in1.add(&lna);in1.add(&in2);in2.add(&lnb);in2.add(&lnc);PrintVisitor pv;in1.accept(pv);
执行结果:
visiting an internal nodevisiting a leafnodevisiting an internal nodevisiting a leafnodevisiting a leafnode