我想要是說適配器模式,提一下“電壓”、“耳機”、“充電器”和 "USB” 的例子應該是比較恰當的了。就說說自己的親身經曆,我原來的手機是NOKIA5730。後來也不知道有沒有國行,但是不推薦大家買這款手機,不適用的哈。我買的時候只有港貨,可是大家知道的啊,香港的充電器和我們大陸的充電器規格是不一樣的,那我要是在國內充電,原機帶的充電器根本用不了,所以要花25RMB買一個公牛的適配器,這樣才可以充電!!
1.初識適配器模式
我想作為一個IT人士,對於適配器應該不陌生,只不過要從理論上講可能描述的不夠到位。實際上,好多系統的開發,都要用到第三方軟體,這樣的話,第三方軟體的介面和我們開發的軟體的介面往往是不一致的,那麼這時候就要“適配”了。看看GoF對適配器模式的說法:
適配器模式:將一個類的介面轉換成客戶希望的另外一個介面,適配器模式使得由於介面不相容而不能一起工作的那些類可以一起工作!!!
一般情況下,適配器包含下面的幾個角色:
目標抽象角色(Target) : 定義客戶所期待要使用的介面,我們把手機當做用戶端,用戶端所需要使用充電器是大陸標準。
源角色(Adaptee) : 需要被適配的介面,在這裡指的是My Phone買的時候內建的港版充電器。
適配器角色(Adapter) :用來把源介面轉換成符合要求的目標介面的裝置,在這裡指的是我自己買的公牛的適配器。
用戶端(Client) :這裡指的就是我那個港版的手機了。
現在來看看適配器模式的結構圖:
註:這裡我們只說一致適配器模式:對象適配器模式,而不談類適配器模式。
2.實現適配器模式的例子
現在,我們看看適配器模式到底是怎麼實現的,怎麼就能“在大陸使用港版的充電器了呢??”
View Code
1 #include <iostream> 2 3 using namespace std; 4 5 class TargetCharger 6 { 7 public: 8 virtual void ChargeRequest() 9 {10 }11 };12 class AdapteeCharger13 {14 public:15 void SpecificRequest()16 {17 cout<<"使用港版充電器充電!!!"<<endl;18 } 19 };20 class AdapterCharger : public TargetCharger21 {22 private:23 AdapteeCharger adaptee;24 public:25 virtual void ChargeRequest()26 {27 cout<<"利用了適配器:公牛充電器,";28 adaptee.SpecificRequest();29 }30 };31 32 33 int main()34 {35 AdapterCharger Adapter;36 TargetCharger *target = &Adapter;37 target->ChargeRequest();38 return 0;39 }
觀察代碼和運行結果,得知策略模式確實是實現了!!確實完成了在大陸使用港版充電器的目的了。那麼我們想一想利用適配器模式有什麼好處呢?不妨假設一下,現在我又在歐洲買了一個手機,這時手機又不能再大陸充電了,怎麼辦呢?這時我們只需要在寫一個類繼承TargetCharget類完成對歐版充電器的適配,這樣我們有能很方便的會用歐洲的手機。怎麼樣?使用適配器模式還能提供統一的介面。
3.實現適配器模式的場合和好處
首先,必須強調的是,適配器模式適用於使用第三方軟體的情況,並且第三方軟體提供的介面和我們開發的系統介面不一致,同時我們正在開發的系統想要改變介面已經不容易了,這時候使用適配器就比較好。其實,適配器模式更像是一個彌補型的模式,當介面不一致時,並且系統開發已經進入了很難改變的時候,這時候可以使用適配器模式,但是如果在開發的早期就發現了介面不一致,盡量不要採用適配器模式,而是最後把介面設計的一致比較好。也就是說適配器模式大部分在軟體開發後期使用的一種設計模式。
具體適用的場合:
1.正在開發的系統想使用一個已經存在的類,並且該類很重要,但是該類提供的介面和系統不一致。
2.使用了第三方軟體,並且第三方提供的軟體的介面和系統不一致。
3.兩個已經存在的類完成的功能一致,但是介面不一樣。可以採用適配器模式,提供一致的介面。
4.對舊系統的複用。
使用適配器模式的好處:
1.充分利用已經存在的資源,實現軟體的複用,節省開發成本和時間。
學習中的一點總結,歡迎拍磚^^