C++轻量级代理模式
【摘要】 前言 在通过QT工具C++语言开发SmartRoom过程中,发现设计代理模式时,存在代码分散的问题。 C++的代理模式有如下2种: 一、抽象类代理 代理接口(虚函数)全部放在抽象类中,后面通过派生抽象类的方式生成实现代理类,在需要代理时,将派生类对象传递给数据源,数据源后面通过抽象接口,传递数据给派生类对象,派生类对象再将数据转给使用方...
前言
在通过QT工具C++语言开发SmartRoom过程中,发现设计代理模式时,存在代码分散的问题。
C++的代理模式有如下2种:
一、抽象类代理
代理接口(虚函数)全部放在抽象类中,后面通过派生抽象类的方式生成实现代理类,在需要代理时,将派生类对象传递给数据源,数据源后面通过抽象接口,传递数据给派生类对象,派生类对象再将数据转给使用方
二、函数代理模式
函数代理,使用通过将函数地址传给数据源,需求方后面通过函数地址接着传回数据给代理函数,代理函数再将数据分发给使用方
可以看出抽象类代理是函数代理的升级款,各有各的使用场景:
对于只有1个场景返回时:使用函数代理
对于多场景返回时:使用抽象类代理
优点:
1、代理方和使用方完全分离,代理方只处理数据不需要处理业务,业务在抛给对应的使用方
缺点:
1、使用方和代理方代码过于分散,代码分布广,查找阅读困难
2、对于多使用方的场景使用成本高,不利于管理,需专门构建分发模块,通过分发模块将数据分配给对应的使用方
3、而且存在野指针、空指针风险
4、对于小场景使用成本高,比如:http请求,每个使用http请求的点都需要实现代理函数
从下图可以看出缺陷:
设计
针对这些存在问题,需要一个更轻量的代码模型,根据Objective-C的block思想,串讲如下模式
核心:
std::function<lambda>作为代理
针对常规代理模式存在的问题,这里都可以解决
1、代码集中,使用方和代理方在一块,可以相关输出数据,是一对一的关系
2、多使用方时,各使用方独立管理自身逻辑,代码完全分割
3、代码集中,存在野指针和空指针的风险较小
4、成本特别小
举例说明:
合入请求:https://codehub-g.huawei.com/WeLink/QT/HWMeetingQT/merge_requests/41
原型:
独立代理:
代理嵌套
实现原理
lambda捕获外部变量时,会根据捕获方式生成对应的捕获类,并根据捕获类生成对应的对象
比如:
第一种:拷贝捕获
捕获类:
第二种 引用捕获
捕获类:
使用场景:
iOS/Mac中间层问题:iOS和mac的中间层就是通过第一种代理模式,通过数组来保存多使用方,导致请求和返回非一对一关系,经常存在错乱,使用此种模式可解决此问题
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)