天天看點

設計模式之擴充卡模式

擴充卡模式(Adapter)是23種設計模式之一。DP中是這麼定義外觀模式的:

擴充卡模式将一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由于接口不相容而不能在一起工作的那些類可以在一起工作。

我們生活中就經常使用到擴充卡,擴充卡這個詞最早應該是出現在電工學裡。有些國家用110V電壓,而我國使用的是220V電壓,但我們的電器,例如手機、筆記本電腦、平闆電腦等,是不能什麼電壓都能用的,于是我們就需要使用電源擴充卡,這樣一來隻要是電,不管多少伏都能适配成需要的電壓。而擴充卡模式就是起到這種作用,将既有的,但是不能夠直接使用的,也無法進行改造的,通過适配後,讓它能夠被使用。

在軟體開發中,也就是系統的資料和行為都正确,但是接口不符時,我們應該考慮用擴充卡,目的是使控制範圍之外的一個原有對象與某個接口比對。擴充卡模式主要應用于希望複用一些現存的類,但是接口又與複用環境要求不一緻的情況,比如在需要對早期代碼複用一些功能等應用上很有實際價值。

在GoF的設計模式中,對擴充卡模式講了兩種類型,類擴充卡模式和對象擴充卡模式,由于類擴充卡模式是通過多重繼承對一個接口與另一個接口進行比對,而Java語言不支援多繼承,是以這裡隻介紹對象擴充卡模式。

擴充卡模式(Adapter)結構圖:

設計模式之擴充卡模式

使用簡單的代碼來實作這個模式的結構:

Target類:

Adaptee類:

Adapter類:

用戶端:

什麼時候适合用擴充卡模式:

1.想使用一個已經存在的類,但是它的接口,也就是方法與你要求的不同時可以考慮使用擴充卡模式。也就是說兩個類所做的事情相似或相同,但是具有不同的接口時可以使用擴充卡模式。使用了擴充卡模式後,類之間就會共享同一個接口,使得用戶端代碼隻需要統一調用同一個接口即可,這樣可以使用戶端的代碼更簡單、直接、緊湊。

2.軟體開發後期或維護期适合使用擴充卡模式,因為維護時會由于開發人員的不同,而造成功能類似,但接口不同的情況,此時就适合使用擴充卡模式。

3.設計一個系統時,如果使用了第三方的元件,而這個元件的接口與我們自己的系統接口不同,但是我們又沒有必要為了迎合它而改動自己的接口,這種情況也可以考慮使用擴充卡模式來解決接口不同的問題。

什麼時候不适合用擴充卡模式:

在設計初期時,就應該統一好接口的定義,盡量不要把接口設計成不同的,以及需要規範好類與方法的命名,是以在這種開發前期的情況下,如果出現接口不同,應該是将不同的接口重構成統一的接口,而不是考慮使用擴充卡模式。擴充卡模式應該用在雙方都不太容易修改接口的時候再使用擴充卡模式進行适配。

是以我們開發時應該事先預防接口的不同的問題,這樣不比對的問題就不會發生。在有小的接口不統一而引起問題時,應該及時對接口進行重構,這樣問題不至于擴大。隻有碰到無法改變原有的設計和代碼的情況時,才考慮适配。事後控制不如事中控制,事中控制不如事前控制。擴充卡模式雖好,但是如果無視它的應用場合而盲目使用,就是本末倒置了。

簡單的擴充卡模式示例:

我這裡之前寫了一個數位産品充電的系統,但是我現在想要加入一個小燈泡,但是小燈泡與數位産品實作的方法不一樣,但是它們同樣需要使用電,是以這時候就可以使用擴充卡了。

結構圖如下:

設計模式之擴充卡模式

數位産品接口,定義一個充電方法:

手機、平闆以及筆記本電腦都實作了這個接口:

我現在要加入一個小燈泡,但是它們實作的方法不一樣:

這時候就需要加上一個擴充卡類了:

這樣在用戶端上就可以使用統一的接口了:

運作結果:

繼續閱讀