C 設計模式 介面卡模式詳解

2021-09-03 08:57:59 字數 3829 閱讀 8504

介面卡模式:講乙個類的介面轉換成客戶期待的另乙個介面,從而從根本上解決兩個類無法在一起工作的情況。

最近在做乙個任務管理的專案,那麼任務管理就應該有任務的基本屬性進行配置、修改、獲取屬性資訊等基本操作。咱們主要檢視任務的基本資訊的獲取這部分內容。

首先定義乙個任務資訊獲取的介面類:

//定義資訊基類

class iinfo ;

//定義資訊基類

class iinfo ;

然後定義乙個關於專案資訊的結構體:

struct projinfo ;
定義專案類:

//專案類

class projectinfo : public iinfo ;

projectinfo::projectinfo(int id, std::string name, std::string startdate, std::string enddate) 

projectinfo::projectinfo()

int projectinfo::getid()

return -1;

}std::string projectinfo::getname()

return "";

}std::string projectinfo::getstartdate()

return "";

}std::string projectinfo::getenddate()

return "";

}

看看如何使用:

int main()
執行一下,可以檢視接專案的一些基本情況:

但是呢,現在公司要和別的單位進行合作共同開發這個軟體專案,他們同樣也有任務這個概念,但是他們的任務定義和自己的任務定義是不一樣的,怎樣才能很好的把它們結合在一起呢?

先看看他們的任務定義:

class trueproject ;
trueproject::trueproject() 

trueproject::~trueproject()

void trueproject::setprojectname(std::string name)

std::string trueproject::getprojectname()

void trueproject::setstartyear(int y)

int trueproject::getstartyear()

void trueproject::setstartmonth(int m)

int trueproject::getstartmonth()

void trueproject::setstartday(int d)

int trueproject::getstartday()

void trueproject::setendyear(int y)

int trueproject::getendyear()

void trueproject::setendmonth(int m)

int trueproject::getendmonth()

void trueproject::setendday(int d)

int trueproject::getendday()

有兩種辦法可以實現:

1. 繼承

同時繼承介面基類和客戶類,並且實現介面類中的函式:

class projectadaper :public iinfo, public trueproject ;
projectadaper::projectadaper() 

projectadaper::~projectadaper()

int projectadaper::getid()

std::string projectadaper::getname()

std::string projectadaper::getstartdate() ;

sprintf_s(ch, "%d-%d-%d", _startyear, _startmonth, _startday);

return std::string(ch);

}std::string projectadaper::getenddate() ;

sprintf_s(ch, "%d-%d-%d", _endyear, _endmonth, _endday);

return std::string(ch);

}

看看客戶端呼叫:

int main()
在不改變客戶端**的情況下,同樣可以實現使用同一的介面檢視這個任務物件的基本資訊。

2. 委託

使用委託的實現也需要繼承介面基類:

class projectadapter2 : public iinfo ;
projectadapter2::projectadapter2(trueproject*proj) 

projectadapter2::~projectadapter2()

int projectadapter2::getid()

std::string projectadapter2::getname()

std::string projectadapter2::getstartdate() ;

sprintf_s(ch, "%d-%d-%d", _trueproject->getstartyear(), _trueproject->getstartmonth(), _trueproject->getstartday());

return std::string(ch);

}std::string projectadapter2::getenddate() ;

sprintf_s(ch, "%d-%d-%d", _trueproject->getendyear(), _trueproject->getendmonth(), _trueproject->getendday());

return std::string(ch);

}

客戶端呼叫:

int main()
總結:

無論是通過繼承方式還是通過委託方式實現介面的裝換適配,類必須遵循黎克特制替代和依賴倒置原則。只有這樣在使用介面卡的場合才能做最小的改動,如果沒有遵循以上兩個原則,即使在適用介面卡的場合專案也會做出很大的改造。

以上的示例就是因為遵循了這兩個原則,只有在剛開始建立任務物件的時候會有所不同,在具體使用這個物件(檢視這個物件基本資訊)的時候,沒有什麼不同,都是一樣的。

咱們把這兩種方式放在一起看一下:

int main()
通過以上**例項可以得知,在獲取專案基本資訊的時候,使用的介面都是一樣的。

介面卡模式的優點:

1.可以使不相干的兩個類可以一起工作;

2.隱藏了目標類的細節;

3.提高了類的復用性。

C 設計模式 介面卡模式

生活中的介面卡 買膝上型電腦,買手機時,都有乙個電源介面卡,電源介面卡又叫外接電源,是小型可攜式電子裝置及電子電器的供電電壓變換裝置,常見於手機,膝上型電腦上。它的作用是將家裡的220v高電壓轉換成這些電子產品能工作的5v 20v左右穩定的低電壓,使它們能正常工作。就是說,如果沒有這個電源介面卡,我...

C 設計模式 介面卡模式

生活中的介面卡 買膝上型電腦,買手機時,都有乙個電源介面卡,電源介面卡又叫外接電源,是小型可攜式電子裝置及電子電器的供電電壓變換裝置,常見於手機,膝上型電腦上。它的作用是將家裡的220v高電壓轉換成這些電子產品能工作的5v 20v左右穩定的低電壓,使它們能正常工作。就是說,如果沒有這個電源介面卡,我...

C 設計模式 介面卡模式

介面卡有兩種實現方式,分別是類介面卡和物件介面卡。這兩種實現方式不太一樣。類介面卡 client 與符合 target 介面的物件協同 adaptee 定義乙個已經存在的介面,這個介面需要適配 adapter 對 adaptee 的介面與 target 介面進行適配 以下幾種情況可以使用 adapt...