首页 技术 正文
技术 2022年11月12日
0 收藏 728 点赞 4,804 浏览 910 个字

使用静态函数impl模式做接口#

impl即桥接模式,主要是为了隐藏数据和减少不必要的编译。

普通的impl模式做接口一般是:

A类是接口,B类继承A类,是A类的实现,C类,包含A类和B类的头文件,把B类对象指针,转做为基类指针,给使用者。代码示意如下:

// a.h
class A{ // 接口类 纯虚函数
virtual void add();
};
///////////////////////////////////////////
// b.h
#include "a.h"
class B:public A{ // 接口实现类
void add();
}
/////////////////////////////////////////
//
#include "a.h"
#include "b.h"
class C{ // 给使用者的类
A* GetA(){
return new B();
};
}
/////////////////////////////////////////
// c.cpp
#include "b.h"
#include "c.h"
// 类c的实现
A* C::GetA(){
return new B();
};
}

但是这样,用了三个类(也有是把第三个类用全局函数或全局对象代替),给使用者至少暴露两个类的头文件A和C;

最近有在看webrtc的音频模块时,看到使用静态函数的方法获取实现类对象,感觉很是精巧,对实现的隐藏性更好,也达到了减少文件暴露,使用者只要包含接口文件即可。

// a.h
class A{ // 接口类
static A* GetA(); // 静态函数,在实现类B的cpp文件实现
virtual void add();
};
///////////////////////////////////////////
// b.h
#include "a.h"
class B:public A{ // 接口实现类
void add();
}
///////////////////////////////////////////
// b.cpp
A* A::GetA(){
return new B();
}

调用静态函数getA()就可以获取实现类B的对象,对于使用者,只需要给接口类A的头文件,甚至使用者根本不知道实现类B的存在。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,086
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,561
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,411
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,184
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,820
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,904