3.4 適配器模式(Adapter)
用途:將一個類的接口轉換成客戶希望的另一個類的接口。
例子:電腦網線USB轉接器
角色:
電腦(客戶端)、網線、轉接器、目標接口NetToUsb
- 目標接口或抽象類(目標抽象類或目標抽象接口):這里例子中就是目標接口USB。
- 適配者類(需要適配的類 Adaptee):它定義了一個已經存在的接口,這個接口需要被適配。在這個例子中網線類就是那個已經存在的接口,但是網線不可以直接插到電腦的USB上。
- 適配器類(Adapter):包裝網線,讓網線支持USB接口,把網線插到USB上並處理請求。
- 適配器類需要同時和兩個類打交道,它要把網線和電腦的USB接口連接在一起。有兩種方式,
- 一種是繼承要被適配的類(網線類)同時實現目標接口。
- 另一種是使用組合模式,不去繼承適配者類,而是使用聚合的方式,讓網線類作為適配器類的一個成員變量,然后再去實現目標抽象接口。
- 適配器類需要同時和兩個類打交道,它要把網線和電腦的USB接口連接在一起。有兩種方式,
分類:
- 類適配器:繼承模式,繼承需要被適配的類,實現目標抽象接口。
- 對象適配器:組合模式,把需要適配的類作為成員屬性變量,同時實現目標抽象接口。
核心理解
適配器模式做的事情是這樣的:
有兩個不相干的類,但是它們想組合到一起使用,那么就通過一個適配器把二者適配在一起使用。
比如說:電腦有一個USB接口,而網線的接頭不是USB的,可是電腦想上網,那么就需要一個接口轉接的適配器來完成這個工作,這時候會出現三個類。
- 網線類:這個類提供了具體要實現的業務方法,也就是它可以完成上網這件事,比如說有一個方法是net()
- USB接口類:這個接口是用戶想要的接口,用戶希望通過USB接口完成上網這件事,比如說有一個方法是execute()
- 轉接器類:這個類來完成二者的適配:首先實現USB接口,然后或者通過繼承網線類或者通過組合網線類,選擇二者的任意一個方式,重寫USB接口里的方法execute(),在這個方法里去調用網線類的真實業務方法net()來完成上網這件事
- 客戶端在調用時,只需要把實例化的網線類通過set注入交給適配器,然后通過調用適配器類的execute()方法就可以完成上網這件事情!