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

访问者Visitor模式:一个作用于某对象结构中的各元素的操作,可用于在不改变各元素的前提下定义作用于这些元素的新操作。

C++11通过可变参数模板,实现一个稳定的接口层,利用可变参数模板的特点,可以让访问者接口层访问任意个数的访问者,不需要每增加一个新的访问者就修改接口层。

#include <iostream>
#include <functional>
#include <string>

using namespace std;

template<typename... Types>
struct Visitor;

template<typename T,typename... Types>
struct Visitor<T,Types...> : Visitor<Types...>
{
    using Visitor<Types...>::Visit;
    virtual void Visit(const T&)=0;
};

template<typename T>
struct Visitor<T>
{
    virtual void Visit(const T&)=0;
};


//测试代码
struct stA;
struct stB;

struct Base
{
    /*
      自动生成stA和stB的visit虚函数,
      struct Visitor<stA,stB>
      {
          virtual void visit(const stA &)==0;
          virtual void visit(const stB &)==0;
      }
      当被访问者需要增加stC、StD和stE时,只需要定义一个新的类型 
      typedef Visitor<stA,stB,stC,stD,stE> MytVisitor; 该类型就会自动生成访问接口
      struct Visitor<stA,stB,stC,stD,stE>
      {
          virtual void visit(const stA &)==0;
          virtual void visit(const stB &)==0;
          virtual void visit(const stC &)==0;
          virtual void visit(const stD &)==0;
          virtual void visit(const stE &)==0;
      }
    */
    typedef Visitor<stA,stB> MytVisitor;   
    virtual void Accept(MytVisitor&)=0;
};

struct stA: Base
{
    double val;
    void Accept(Base::MytVisitor& v)
    {
        v.Visit(*this);
    }
};

struct stB: Base
{
    double val;
    void Accept(Base::MytVisitor& v)
    {
        v.Visit(*this);
    }
};

struct PrintVisitor:Base::MytVisitor
{
    void Visit(const stA& a)
    {
        cout<<"from stA: "<<a.val<<endl;
    }
    
    void Visit(const stB& b)
    {
        cout<<"from stB: "<<b.val<<endl;
    }
};

int main()
{
    PrintVisitor vis;
    stA a;
    a.val=123.12;
    stB b;
    b.val=34.56;
    Base* base=&a;
    base->Accept(vis);
    base=&b;
    base->Accept(vis);
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值