介面卡模式:講乙個類的介面轉換成客戶期待的另乙個介面,從而從根本上解決兩個類無法在一起工作的情況。
最近在做乙個任務管理的專案,那麼任務管理就應該有任務的基本屬性進行配置、修改、獲取屬性資訊等基本操作。咱們主要檢視任務的基本資訊的獲取這部分內容。
首先定義乙個任務資訊獲取的介面類:
//定義資訊基類
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...