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

原创 2016年03月28日 21:46:56

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

  • (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
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lanchunhui/article/details/51001558

C++语言基础

C++是一门高效而实用的程序设计语言,本课详细介绍C++语言中的封装、数据隐藏、继承、多态的实现,主要包括类的声明、对象定义、构造函数和析构函数、运算符重载、继承和派生、多态性实现等。课程需要有C语言程序设计的基础(可以利用本人开出的《C语言与程序设计》系列课学习)。课程继续关注学习者能够通过实践的方式,学会利用C++语言解决问题,具备进一步学习利用C++开发应用程序的基础。
  • 2015年03月01日 10:55

我所理解的设计模式(C++实现)——访问者模式(Visitor Pattern)

我们去银行柜台办业务,一般情况下会开几个个人业务柜台的,你去其中任何一个柜台办理都是可以的。我们的访问者模式可以很好付诸在这个场景中:对于银行柜台来说,他们是不用变化的,就是说今天和明天提供个人业务的...
  • LCL_data
  • LCL_data
  • 2013-09-12 16:07:39
  • 18804

访问者模式(Visitor Pattern)的c++实现示例

访问者模式是一种分离对象数据结构与行为的方法,通过这种分离,可以为一个已存在的类或类群(即被访问者)增加新的操作(即访问者)而无需为它们作任何修改。访问者模式属于行为型模式。 为什么要使用访问者模式?...
  • hityct1
  • hityct1
  • 2009-05-09 23:47:00
  • 6344

设计模式C++学习笔记之十八(Visitor访问者模式)

博文很精彩,为方便个人学习特转载,地址:http://www.cnblogs.com/wanggary/archive/2011/04/21/2024099.html 18.1.解释 概念:表...
  • phiall
  • phiall
  • 2016-03-17 23:01:20
  • 336

c++ 访问者模式

/** VISITOR模式:将操作独立于类之外,类根据自己需要的操作而接受相应的访问者。 这样做的好处是如果需要实现一个新操作,类的结构不用变,特别是整个类层次的操作,如果要变,代价是比较大...
  • TimothyFly
  • TimothyFly
  • 2012-08-16 09:17:34
  • 1405

C++设计模式实现--访问者(Visitor)模式

一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作。它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 结构如下: 二. 举例 假设有一项...
  • L_Andy
  • L_Andy
  • 2014-07-04 16:12:22
  • 1333

Visitor模式

Visitor模式 Visitor模式作用是表示一个作用于某个对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下 定义作用于这些元素的新操作。 开发时...
  • u010002704
  • u010002704
  • 2014-12-02 13:52:33
  • 626

Vistor访问者模式(C++访问者模式)

Visitor模式在不破坏类的前提下,为类提供增加新的新操作。 Visitor模式经常用于将更新的设计封装在一个类中,并且由待更改的类提供一个接受接口,其关键技术在于双分派技术,Element类提供接...
  • yc7369
  • yc7369
  • 2014-12-08 23:46:26
  • 765

设计模式---访问者模式(C++实现)

/***************************************************************************************************...
  • alpha_love
  • alpha_love
  • 2017-03-13 14:03:15
  • 252

Visitor模式与Acyclic Visitor

visitor模式最基本的是访问者和被访问者。它的优势是不用改变被访问类的任何结构就可以对被访问者施加新的操作,前提是增加一个访问者的子类。其实就是用增加访问者子类的方法替代被访问者方法的增加。用你不...
  • win2ks
  • win2ks
  • 2007-09-19 15:42:00
  • 1269
收藏助手
不良信息举报
您举报文章:C++ 设计模式 —— 访问者(Visitor)
举报原因:
原因补充:

(最多只允许输入30个字)