首页 > 编程语言 > 详细

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

时间:2016-03-29 10:40:48      阅读:113      评论:0      收藏:0      [点我收藏+]

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

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

客户端代码:

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

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

原文:http://blog.csdn.net/lanchunhui/article/details/51001558

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!