句柄類是存儲(chǔ)和管理基類指針的一個(gè)類
需要句柄類的背景:
1)在對(duì)安全要求很高的領(lǐng)域,即使核心實(shí)現(xiàn)已經(jīng)封閉在庫中不可見,但頭文件中變量定義仍可能曝露一些內(nèi)部信息
2)在設(shè)計(jì)初期、實(shí)現(xiàn)部分會(huì)經(jīng)常變動(dòng),甚至頭文件中變量定義也需要經(jīng)常變動(dòng),因此在重編譯的時(shí)候頭文件也需要編譯,
有時(shí)候?qū)е戮幾g時(shí)間過長(zhǎng)。
句柄類就是為了解決這類問題
// Handle.h
class Implement; //這里是對(duì)真正實(shí)現(xiàn)功能的類的聲明
class ImplementHandle //這是Implement類的句柄類
{
public:
ImplementHandle():lpImplementInstance(NULL){lpImplementInstance = new Implement;}
~ImplementHandle(){ delete lpImplementInstance ;}
public:
// Interface_FOO() 是句柄類提供的接口,它的真正實(shí)現(xiàn)是在Implement類里面,而這個(gè)僅僅是接口"代理"
RE_TYPE Interface_FOO()
{
return lpImplementInstance->FOO
_
Implementation(); //句柄代理調(diào)用實(shí)現(xiàn)真正的FOO接口
}
//還有其他的接口也一樣,均是用句柄類代理接口
//....
private:
Implement * lpImplementInstance; //這個(gè)是句柄類唯一的數(shù)據(jù)成員(當(dāng)然,并不一定),可以被句柄類很好地自動(dòng)管理
};
被封裝在句柄類里面的真正實(shí)現(xiàn)(class Implement)將與用戶隔離開來,就是說,就算以后Implement 類的實(shí)現(xiàn)有所改變,
只要它提供的接口不變,那么它的句柄類就不會(huì)改變,而包含句柄類的用戶,也不用做任何相應(yīng)的改變(所有包含 “Handle.h”的模塊甚至不用從新編譯就可以正常更新至最新的Implement實(shí)現(xiàn))。
例如
#include "Handle.h"
Imlementhandle testhandle;
testhandle->Interface_Foo();//調(diào)用接口即可。
如果改動(dòng)了Implent類的方法
于此相反,如果直接用class Implement 的定義,那么只要Implement類的定義有所改變(不管是public 還是private 成員
的更新),那么所有包含它的頭文件的模塊都要從新編譯一次。
這其實(shí)就是接口與實(shí)現(xiàn)的分離,