栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++访问者模式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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
struct AutoDis : Elem {
    void accept(Visitor& vist) {
        vist.visit(static_cast(*this));
    }
};
struct VideoFile : AutoDis {
    
};
struct TextFile : AutoDis {
    
};

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1030941.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号