適配器模式屬于結構型的設計模式,它是結構型設計模式之首(用的最多的結構型設計模式)。
適配器設計模式也并不復雜,適配器它是主要作用是將一個類的接口轉換成客戶希望的另外一個接口這樣使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。適配器模式有兩種:1.類的適配器 2.對象適配器,對象適配器更多一些。
示例:比如你在網上買了一個手機,但是買家給你發回來了一個3接頭的充電器,但是恰好你又沒有3接頭的插槽,只有2個接口的插槽,于是你很直然地便會想到去找你個3接口轉兩接口的轉換器。簡單的分析下這個轉換器便是我們這里的適配器Adapter。三相插頭便是我們要適配的Adaptee,兩相插類適配器-----在我看來C++的類適配器的用多重繼承實現,并提供適配后的接口。
這是你的三相插頭
1
2
3
4
5
6
7
8
|
class ThreePhaseOutlet { public : void doThreePhasePlugin() { cout<< "三相插頭強勢插入!" <<endl; } }; |
這是你想要的兩相插頭
1
2
3
4
5
|
class TwoPhaseOutlet { public : virtual void doPlugin() = 0; }; |
然后你將需要找到一個轉接頭,將三相插頭轉換為“兩相插頭”
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class OutletConvertor: public TwoPhaseOutlet, public ThreePhaseOutlet { public : void doPlugin() { doConvertor(); doThreePhasePlugin(); } void doConvertor() { cout<< "三相插頭轉為兩廂插頭!" <<endl; } }; |
現在你可以強勢插入兩相的插口了。
1
2
|
TwoPhaseOutlet* outlet = new OutletConvertor(); outlet->doPlugin(); |
對象適配器模式-----對象適配器是將需要適配的對象進行包裝然后提供適配后的接口。
對象適配器的 三相插口和轉接頭的代碼和上面一致。只是整合步驟不一致
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class OutletConvertor : public TwoPhaseOutlet { public : void doPlugin() { doConvertor(); m_out.doThreePhasePlugin(); } void doConvertor() { cout<< "三相插頭轉為兩廂插頭!" <<endl; } ThreePhaseOutlet m_out; }; |
對象適配器相比類適配器來說更加靈活,他可以選擇性適配自己想適配的對象。例如我們下面把代碼改成這樣,你也許就會明白為什么我這樣說:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class OutletConvertor : public TwoPhaseOutlet { public : OutletConvertor(ThreePhaseOutlet out) { m_out = out; } void doPlugin() { doConvertor(); m_out.doThreePhasePlugin(); } void doConvertor() { cout<< "三相插頭轉為兩廂插頭!" <<endl; } ThreePhaseOutlet m_out; }; |
我們在構造的時候將具體需要適配的適配對象傳入,這樣便可以根據傳入不同的對象,從而對該對象進行適配。而類適配器卻無法選擇對象,他是對整個類進行適配。也就是把所有的三相插口全部轉換為兩相的,而不是針對某一個。
在以下各種情況下使用適配器模式:
1、 系統需要使用現有的類,而此類的接口不符合系統的需要。
2、 想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。這些源類不一定有很復雜的接口。
3、 (對對象適配器而言)在設計里,需要改變多個已有子類的接口,如果使用類的適配器模式,就要針對每一個子類做一個適配器,而這不太實際。
Adapter模式在實現時有以下這些值得注意的地方:
1、 目標接口可以省略,模式發生退化。但這種做法看似平庸而并不平庸,它可以使Adaptee不必實現不需要的方法(可以參考Default Adapter模式)。其表現形式就是父類實現缺省方法,而子類只需實現自己獨特的方法。這有些像模板(Template)模式。
2、 適配器類可以是抽象類。
3、 帶參數的適配器模式。使用這種辦法,適配器類可以根據參數返還一個合適的實例給客戶端。