C++访问者模式

这个概念我简单的描述一下:

假设我们拥有一个由不同种类的对象构成的对象结构,这些对象的类都拥有一个accept方法用来接受访问者对象;访问者是一个接口,他拥有一个visit方法,这个方法可以对访问到的对象结构中不同类型的元素做出不同的反应。

具体详细概念,可以在网上百度一下,我准备贴出例子,通过代码来阐述这个概念:

struct VideoFile;
struct TextFile;

struct Visitor {
    virtual void visit(VideoFile&) = 0;
    virtual void visit(TextFile&) = 0;
    virtual ~Visitor() = default;
};

struct Elem {
    virtual void accept(Visitor& visit) = 0;
    virtual ~Elem() = default;
};
struct VideoFile : Elem {
    void accept(Visitor& visit) {
        visit.visit(*this);
    }
};
struct TextFile : Elem {
    void accept(Visitor& visit) {
        visit.visit(*this);
    }
};

Visitor就是一个访问者,他访问基于Elem的子类。子类通过访问者的接口函数将this传递给访问者。

为了防止大量出现accept函数的出现,以下使用模板进行了优化动作:

struct VideoFile;
struct TextFile;

struct Visitor {
    virtual void visit(VideoFile&) = 0;
    virtual void visit(TextFile&) = 0;
    virtual ~Visitor() = default;
};

struct Elem {
    virtual void accept(Visitor& visit) = 0;
    virtual ~Elem() = default;
};

template<typename T>
struct AutoDis : Elem {
    void accept(Visitor& vist) {
        vist.visit(static_cast<T&>(*this));
    }
};
struct VideoFile : AutoDis<VideoFile> {
    
};
struct TextFile : AutoDis<TextFile> {
    
};

这个模板体现的是一种奇异递归模板模式,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值