適配器模式(Adapter)-結構型模式
適配器模式,對剛剛接觸設計模式的朋友來說是一個即陌生有熟悉的模式,聽起來很矛盾對吧,在我們的編程中很多時候我們都用到了這個模式,但您也許沒有想起來,等我們學習完後你會驚奇的說聲:啊!原來我一直在用這個模式啊。其實在我們生活中處處都有這種模式的存在,小到一個手機的萬能充電器(不要告訴我你沒見過這玩意)都存在這一個原則,在不破壞或更改原有實體的前提下,利用原有實體的特性(方法)定制一個新實體來達到用戶需要的效果。聽起來沒頭沒腦的呵呵!讓我們看看他的結構就恍然大悟了
用戶的需求是千變萬化的,他們可能要給MOTO手機充電也可能會給諾基亞手機或者其他的手機充電,但每個手機肯定有充電的接口,所以這裡定義了一個抽現的手機類,萬能充電器繼承了抽現手機類,也繼承了萬能充電器的接口,這樣不管什麼手機,只要他提供充電接口,萬能充電器總是可以幫他充電。這種適配叫做類適配模式。
這個是生活中的一個小例子,那在我們回到現實開發中來,很多朋友肯定遇到過這樣的情況,自己原先積累的一些自己的類庫,在項目開發中時項目經理告訴你他提供喽一個接口告訴你需要實現什麼功能,你發現這個功能和你類庫中的某個類提供的功能是基本符合的,但接口的名字不一樣,這時你需要建一個類這個類成員中存放自己類庫中的類,繼承並實現項目經理給的接口。這個就是結構型適配器。這個和我上面將的類適配不同點是把原有的類實體一個是直接繼承,一個是當作類成員。2者有區別嗎?那是當然有了。
類適配:是正對單一的類型做的適配。
結構適配:是對多類型實體實現一個接口方法。
看到這裡你是否明白了適配器模式了呢,是否驚奇的發現原來你一直在用這個模式了呢。
讓我們回頭看看這個OOD設計是否合理,我們依據我們第二章的設計模式原則來判定
1. 是否符合開閉原則
我們對原有手機的充電接口沒有做任何改變,在外面添加一個適配器類做對應方法。
答案:符合
2. 是否符合裡氏代換原則
萬能充電器繼承的是手機抽象類,如果他繼承的是MOTO手機或是諾基亞手機類都是可以的。
答案:符合
3. 是否符合依賴倒置原則
萬能充電器類對抽象手機的依賴和對充電接口的依賴
答案:符合
4. 是否符合接口隔離原則
答案:符合
5. 是否符合抽象原則
答案:符合
6. 是否符合迪米特法則
答案:符合
總結 :原型模式
意圖:
將一個類的接口轉換成另一個類客戶希望的另一個接口。Adapter模式使得原本由接口不兼容而不能一起工作的那些類可以一起工作
動機:
為了復用原有的類完成客戶希望通過不同的接口完成的任務。
實用性:
l 用戶自定義類的復用
l 在原有自定義類上進行擴展,達到客戶需要的效果和指定的接口適用性:
l 使用一個已經存在的類,而它的接口不符合你的需求
l 創建一個可以復用的類,該類可以與其他不相關的類或不可預見的類(即那些接口可能不一定兼容的類)協同工作。
l 使用一些已經存在的子類,但不可能對每個都進行子類化以配置他們的接口。對象適配器可以適配它的父類接口(僅適用於對象Adapter)
結構:
參與者:
l Target (萬能充電器接口)
l Adapter (萬能充電器)
l Adaptee (品牌充電器 摩托羅拉充電器,諾基亞充電器)
注意:
區分類適配器和對象適配器
1. 類適配器
l 用一個具體的Adapter類對Adaptee和Target進行匹配。結果是當我們想要匹配一個類以及所有他的子類時,類Adapter將不能勝任工作。
l Adapter可以重定義Adaptee的部分行為,因為Adapter是Adaptee的一個子類
l 僅僅引入了一個對象並不需要額外的指針以間接等到adaptee.
2. 對象適配器
l 允許一個Adapter也多個Adaptee同時工作,Adapter也可以一次給所有的Adaptee添加功能
l 重定義Adaptee的行為比較困難。這就需要生成Adaptee的子類兵器使得Adapter引用這個子類而不是引用Adaptee本身。