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

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

  • (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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值