介紹
適配器是將兩個不兼容的類融合在一起,有點像粘合劑,將不同的東西通過一種轉換使得它們能夠協作起來。
例如,經常遇到兩個沒有關系的類型之間進行交互,第一個解決方案是修改各自類的接口,但是如果沒有源碼或者我們不愿意為了一個應用而修改各自的接口,此時我們可以使用一個 Adapter,這個 Adapter 會將這兩個接口進行兼容,在不修改原有代碼的情況下滿足需求。
定義
適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。
使用場景
- 系統需要使用現有的類,而此類的接口不符合系統需求,即接口不兼容
- 想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作
- 需要一個同一的輸出接口,而輸入接口的類型不可預知
類適配器模式
Target 目標角色,也就是所期待的得到的接口,這里的目標不可以是類,必須是接口
Adaptee 需要適配的接口,也就是源接口
Adapter 適配器角色,本模式的核心,適配器把源接口轉換成目標接口,這個角色不可以是接口,必須是具體類
Target 是客戶端想要得到的對象,而系統只提供源接口,這時候就通過 Adapter 實現 Target 接口,并繼承源接口,在實現目標接口方法時,根據源接口的方法,實現目標接口的功能。最終將源接口轉換成目標接口。
對象適配器模式
與類的適配模式一樣,對象的適配器模式把被適配類的 API 轉換成目標類的 API,與類適配器模式不同的是,對象的適配器模式不是使用繼承關系連接到源接口類,而是使用代理關系連接到 Adapter 類。
為了使客戶端使用源接口的方法,提供了一個 Adapter,這個包裝類包裝了一個源接口的實例,并且 Adapter 實現了目標接口,從而包裝類能夠把 Adapter 的 API 和 目標類的 API 銜接起來,Adapter 中目標接口的實現根據源接口的實例來完成。Adapter 和源接口是委派關系,這決定了適配器模式是對象的。
這種實現方式直接將要被適配的對象傳遞到 Adapter 中,使用組合的形式實現接口的兼容效果,比類適配器模式更靈活。另一個好處是被適配對象中的方法不會暴露出來,類適配器由于繼承了源接口,所以源接口中的方法在 Adapter 中都有,是的 Adapter 中方法較多。因此對象適配模式更加靈活、實用。
實際開發中 Adapter 除了應用于進行不兼容的類型轉換,還有一種就是輸入有無數種,但是輸出類型是同一的,我們可以通過 Adapter 返回一個統一的輸出,而具體的輸入留給用戶處理,內部只需要知道輸出的是符合要求的類型即可。
Android 源碼中的適配器模式
ListView 與 Adapter 的配合使用,我們需要使用 Adapter 加載每個 Item View 的布局,并且進行數據綁定等操作。Adapter 統一將 Item View 輸出為 View ,這樣就很好的應對了 Item View 的可變性。這雖然有些脫離 Adapter 模式將不兼容的接口轉換為可用接口的使用場景,但也是 Adapter 模式的一種變種實現。
優點
- 更好的復用性,系統需要使用現有的類,而此類的接口不符合系統需要,通過適配器模式就可以讓這些功能得到更好的復用
- 更好的擴展性,在實現適配器功能的時候,可以調用自己開發的功能,從而自然地擴展系統的功能
缺點
過多使用時系統會非常凌亂,不易整體把握。例如命名看到的是調的 A 接口,實際內部被適配成了其他接口。