訪问者设计模式的实现借助于两个继承体系,
- (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<Node*> _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 node
visiting a leafnode
visiting an internal node
visiting a leafnode
visiting a leafnode