C++轻量级代理模式

举报
媒体服务小助手ultra 发表于 2023/11/10 15:18:12 2023/11/10
【摘要】 前言    在通过QT工具C++语言开发SmartRoom过程中,发现设计代理模式时,存在代码分散的问题。    C++的代理模式有如下2种:        一、抽象类代理                代理接口(虚函数)全部放在抽象类中,后面通过派生抽象类的方式生成实现代理类,在需要代理时,将派生类对象传递给数据源,数据源后面通过抽象接口,传递数据给派生类对象,派生类对象再将数据转给使用方...

前言

    在通过QT工具C++语言开发SmartRoom过程中,发现设计代理模式时,存在代码分散的问题。
    C++的代理模式有如下2种:
        一、抽象类代理
                代理接口(虚函数)全部放在抽象类中,后面通过派生抽象类的方式生成实现代理类,在需要代理时,将派生类对象传递给数据源,数据源后面通过抽象接口,传递数据给派生类对象,派生类对象再将数据转给使用方
            

1.png

 
二、函数代理模式
函数代理,使用通过将函数地址传给数据源,需求方后面通过函数地址接着传回数据给代理函数,代理函数再将数据分发给使用方

2.png


 
可以看出抽象类代理是函数代理的升级款,各有各的使用场景:
对于只有1个场景返回时:使用函数代理
对于多场景返回时:使用抽象类代理
优点:
1、代理方和使用方完全分离,代理方只处理数据不需要处理业务,业务在抛给对应的使用方
缺点:
1、使用方和代理方代码过于分散,代码分布广,查找阅读困难
2、对于多使用方的场景使用成本高,不利于管理,需专门构建分发模块,通过分发模块将数据分配给对应的使用方
3、而且存在野指针、空指针风险
4、对于小场景使用成本高,比如:http请求,每个使用http请求的点都需要实现代理函数
 
从下图可以看出缺陷:

3.png


设计

针对这些存在问题,需要一个更轻量的代码模型,根据Objective-C的block思想,串讲如下模式

核心:

std::function<lambda>作为代理

4.png

针对常规代理模式存在的问题,这里都可以解决

1、代码集中,使用方和代理方在一块,可以相关输出数据,是一对一的关系

2、多使用方时,各使用方独立管理自身逻辑,代码完全分割

3、代码集中,存在野指针和空指针的风险较小

4、成本特别小

举例说明:

合入请求:https://codehub-g.huawei.com/WeLink/QT/HWMeetingQT/merge_requests/41

原型:

5.png

独立代理:

6.png

代理嵌套

7.png

实现原理

lambda捕获外部变量时,会根据捕获方式生成对应的捕获类,并根据捕获类生成对应的对象

比如:

第一种:拷贝捕获

8.png

捕获类:

9.png

第二种 引用捕获

10.png

        捕获类:

11.png

 

使用场景:

iOS/Mac中间层问题:iOS和mac的中间层就是通过第一种代理模式,通过数组来保存多使用方,导致请求和返回非一对一关系,经常存在错乱,使用此种模式可解决此问题

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。