不要重复发明轮子:C++重用的5重境界(3)——代理接口DLL

简介:

第三重境界:代理接口DLL

看到这个名字,可能大家有点迷糊:代理?接口?DLL?三个风马牛不相及的东东扯到一块是什么意思呢?

其实只要按照字面意思就能够大概理解:

代理:就是设计模式中的代理模式;

接口:就是Java中的Interface一个概念;

DLL:就是动态链接库了:)

翻译成一句完整的话就是:DLL通过代理模式对外提供接口

 

下面我们看看这个“代理接口DLL”是如何实现的。

/*******************************DLL代码*********************************/

//声明部分

class __decspec(dllexport) InterfaceClass{    //声明接口类

    class RealizeClass;                   //引入实现类

    RealizeClass* m_pRealizeClass;        //指向实现类的指针,咦,怎么会有数据

    public:

    void Function1(int param1, char param2 );

    void Function2(int param1;

    void Function3(bool param1, char param2 );

    ……………………………………………….

}

 

//实现部分

InterfaceClass::InterfaceClass(){

    m_pRealizeClass = new RealizeClass();

}

 

InterfaceClass:: Function1(int param1, char param2 ){

    return m_pRealizeClass-> Function1(param1, param2 );

}

//其它函数略。

/*******************************DLL代码*********************************/

 

/***************************使用DLL的客户端代码********************/

InterfaceClass   pInterfaceClass = new InterfaceClass();

pInterfaceClass->Function1(param1, param2);

/***************************使用DLL的客户端代码********************/

各位看完上面的样例,基本上应该都能够明白是如何实现的,但可能会问“为什么还是有一个指针数据类型呢”?不是说没成员数据的吗?

是的,这里关键就在于这个指针,虽然有这个成员数据,但是大家想一想,指针是一个固定大小的类型,而且客户端程序是看不到这个指针的。因此不管对于以下哪个变化,InterfaceClass的结构都不变化,客户端的代码也不受任何影响,不需要重新编译。

1)  具体实现的RealizeClass增加、修改、删除成员数据;

2)  RealizeClass有一天改了名称变成了RealizeClassSE

3)  RealizeClassFunction1函数改名了,甚至加了一个缺省参数了。

 

讲了半天,基本上把“代理接口DLL”是一个什么东东、如何实现讲完了,但是最根本的问题还没有回答——这重境界要解决什么问题?

其实看完如何实现后,聪明的你基本上都能猜出要解决什么问题了,当然就是第二重境界遗留的两个问题了:

1)  修改类定义:例如增加一个成员变量。

2)  修改函数定义:例如增加一个函数参数,修改某个入参类型;

代理接口DLL通过代理模式(其实本质上就是一个指针)解决了上述两个问题,把对外呈现和内部实现分别由不同的类实现,然后通过一个简单的指针将两个类连接起来。

 ========未完待续,后面更精彩===========

相关文章
|
C++
C++中类的接口与实现分离的技术性探讨
C++中类的接口与实现分离的技术性探讨
562 1
【C++】实现日期类相关接口(三)
【C++】实现日期类相关接口
167 5
【C++】实现日期类相关接口(二)
【C++】实现日期类相关接口
206 1
【C++】实现日期类相关接口(一)
【C++】实现日期类相关接口
167 1
|
BI 定位技术 C++
超级好用的C++实用库之地理相关接口
超级好用的C++实用库之地理相关接口
287 0
|
存储 C++
C++ dll 传 string 类 问题
C++ dll 传 string 类 问题
227 0
|
存储 编译器 Linux
【C++】string类的使用②(容量接口Capacity )
这篇博客探讨了C++ STL中string的容量接口和元素访问方法。`size()`和`length()`函数等价,返回字符串的长度;`capacity()`提供已分配的字节数,可能大于长度;`max_size()`给出理论最大长度;`reserve()`预分配空间,不改变内容;`resize()`改变字符串长度,可指定填充字符。这些接口用于优化内存管理和适应字符串操作需求。
|
C++ 容器
【C++】string类的使用①(迭代器接口begin,end,rbegin和rend)
迭代器接口是获取容器元素指针的成员函数。`begin()`返回首元素的正向迭代器,`end()`返回末元素之后的位置。`rbegin()`和`rend()`提供反向迭代器,分别指向尾元素和首元素之前。C++11增加了const版本以供只读访问。示例代码展示了如何使用这些迭代器遍历字符串。
|
数据采集 自然语言处理 数据挖掘
一文搞懂:【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信
一文搞懂:【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信
1005 0
|
Java API Android开发
Java通过JNI调用C++的DLL库
Java通过JNI调用C++的DLL库
486 0