目錄
設計模式-02 擴充卡模式
簡介
例子
使用繼承
使用委托
分析
總結
通用結構
如何選擇
何時使用
如何使用
當把手機或筆記本電腦插到插座上充電時,擴充卡就發揮了功效。擴充卡的作用是使産生 220 V 的插座和需要 4 V 的移動裝置能夠互相适應,完美地發揮二者的功效。類似地,通過在程式中使用擴充卡模式,可以做到不相容的接口在一起正常工作,而填補現有程式和所需程式之間差異就是 Adapter 的工作:

Adapter 模式有兩種:
類擴充卡模式(基于繼承)。
對象擴充卡模式(使用委托)。
類圖
代碼
對于第一種情況:
我們的目标,就是 Print 接口規定的内容,也就是它含有的兩個方法:<code>printWeak()</code>和<code>printStrong()</code>,對應弱提示列印和強提示列印。
Banner 則是被适配的對象,它能夠按照一定的規則列印字元串,但是這兩個功能還不滿足 Print 類彙總規定的類容。
PrintBanner 就是擴充卡,它實作了 Print 接口,也就是說它能完成目标工作;它又繼承了 Banner,代表它能夠使用被适配對象的功能(方法)。
對于第二種情況
我們的目标,或者說是要适配成的樣子,就是 Print 類的内容,也就是它含有的兩個方法:<code>printWeak()</code>和<code>printStrong()</code>,對應弱提示列印和強提示列印。
PrintBanner 就是擴充卡,它繼承自 Print,也就是說它适配目标,在其中它又将 Banner 組合成了自己的字段,為了完成 Print 定義的目标,它使用了 banner 字段的方法。
在兩種情況下,我們都隻需要調用 Print 接口中的方法,就可以使用老舊的被适配者來實作新的功能,注意,我們使用到了老舊的被适配者,并不是将它們剔除掉了。這也是 OCP 原則的展現,為了實作新的功能,我們隻是增加,而不是修改原有的代碼。
基于繼承:
基于委托:
在考慮靈活和拓展性的前提下,組合委托必然是優于繼承的,後者是一種高耦合的行為。
擴充卡模式适用于非常多的情境,比如你在網上找到了一段代碼,并且想要在其中添加一些額外的功能,修改源代碼似乎不是一種明治的行為,甚至有些時候會構成法律問題。擴充卡模式就能夠幫助你,将這段代碼以你規定的方式(Target)引入到項目中。
直接引入這些工具類似乎是一個更加簡單、愉悅的選擇,何必大費周章地衍生出那麼多接口或者抽象類,再通過進行複雜的繼承和實作才引入它們。
在我看來,直接引入是一種極具侵略性的行為,是不符合預期的行為。系統或者某個子產品的功能應該由接口來定義,如果直接引入工具類,無異于在自己的系統中增加了一個未曾預想過的接口,這是對工程原則的違反,是一種具有風險的行為。而通過擴充卡模式将它轉換,隐匿到已定義的接口中則是一種歸化,溫馴而且符合預期,符合工程原則。