C++ 设计模式 —— 访问者(Visitor)

访问者设计模式的实现借助于两个继承体系,

  • (1)elements:一个是被操作的类(基类及其子类)
  • (2)visitors:一个定义了一系列操作的访问者(基类及其子类)

访问者模式是一种行为型设计模式(behavioral design pattern),被用于为一个树形结构(Node、LeafNode、InternalNode)中的 elements 增加操作。使用访问者设计模式,我们不需在 elements 类内部编写相关成员函数实现功能,而是将操作定义在另外的一个类的继承体系中,也即 Visitors。(实现了一种分离?)


C++ 设计模式 —— 访问者(Visitor)_第1张图片

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;
};

客户端代码:

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

你可能感兴趣的:(设计模式,小议设计模式)