您的位置:首页 > 编程语言 > C语言/C++

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

2009-04-12 21:13 417 查看
第三重境界:代理接口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)  RealizeClass的Function1函数改名了,甚至加了一个缺省参数了。
 
讲了半天,基本上把“代理接口DLL”是一个什么东东、如何实现讲完了,但是最根本的问题还没有回答——这重境界要解决什么问题?
其实看完如何实现后,聪明的你基本上都能猜出要解决什么问题了,当然就是第二重境界遗留的两个问题了:
1)  修改类定义:例如增加一个成员变量。
2)  修改函数定义:例如增加一个函数参数,修改某个入参类型;
代理接口DLL通过代理模式(其实本质上就是一个指针)解决了上述两个问题,把对外呈现和内部实现分别由不同的类实现,然后通过一个简单的指针将两个类连接起来。
 ========未完待续,后面更精彩===========
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息