設計模式7-介面卡模式(Adapter)總結整理與練習
本文是對面向物件設計模式--介面卡模式(Adapter)的學習整理總結與練習,主要分為模式定義、學習要點整理、多案例練習加深對模式的理解、最後總結知識要點。
第一篇:模式定義
命令模式是GoF四人幫整理的《設計模式-可複用面向物件軟體基礎》一書中23種設計模式中歸類為結構型模式中的設計模式,23種設計模式根據它們的用途分為三大類:5種建立型模式、7種結構型模式、11種行為型模式。
介面卡模式:
將一個類的介面轉換成客戶希望的另外一個介面。Adapter模式使得原本由於介面不相容而不能在一起工作的那些類可以一起工作。
介面卡模式其目的就是為了將一個介面--被適配者轉換成目標介面,使得通過目標介面便可以呼叫被適配介面的物件。介面卡模式根據介面卡的實現方式分為類介面卡和介面介面卡,類介面卡通過組合的方式,介面卡類直接引用被適配物件。介面介面卡通過繼承或實現的方式,介面卡類同時實現目標介面與被適配介面。
第二篇:學習要點整理
裝飾者模式將物件包裝起來,賦予它們新的職責。介面卡則是以不同目的,包裝某些物件:讓它們的介面看起來不像自己而像是別的東西。
為何要這樣做?因為這樣就可以在設計中,將類的介面轉換成想要的介面,以便實現不同的介面。
現實生活中的介面卡
有一個壁式三孔插座和一個二口插頭,現在為了讓插頭能夠插入插座正常通電,需要一個介面卡,它的工作就是將三孔插座轉換成二孔插座,好讓二口插頭插進這個插座而得到電力。
或者說:介面卡改變了插座的介面,以符合二口插頭的需求。
1.A、B兩個圖框代表已經塑模成型的物體A和物體B,那現在要求把A和B安裝在一起使用,如何安裝?
2.兩者的介面不一致,是不可能安裝在一起使用的,那怎麼辦?引入一個物體C,C適應了物體A的介面,同時也適應了物體B的介面,然後三者就可以組合成一個完整的物體。
3.其中的物體C就是我們說的介面卡,它在中間起到了角色轉換的作用,把原有的長條形介面轉換了三角形介面。 介面卡模式也是相似的功能。
面向物件中的介面卡
面向物件中介面卡扮演的角色是:將一個介面轉換成另一個介面,以符合客戶的期望。
假設已有一個軟體系統,你希望它能和一個新廠商類庫搭配使用,但是這個新廠商所設計出來的介面,不同於舊廠商的介面。
你不想改變現有的程式碼,解決這個問題,你可以寫一個類,將新廠商介面轉接成你所期望的介面。這個介面卡工作起來就如同一箇中間人,它將客戶所發出的請求轉換成廠商類能理解的請求。
介面卡模式的工作是將一個介面轉換成另一個介面。大多數情況採用的都是讓一個介面卡包裝一個被適配者,但複雜的情況下,也可以讓一個介面卡包裝多個被適配者。
這個模式可以通過建立介面卡進行介面轉換,讓不相容的介面變成相容。這可以讓客戶從實現的介面解耦。
第三篇:案例實踐
AdapterDemo物件介面卡模式實現案例:
介面卡模式把一個類的介面變換成客戶端所期待的另一個介面,從而使原本因為接中不匹配而無法一起工作的兩個類能夠在一起工作。
DuckAdapterDemo鴨子介面卡案例:
情況緊急,你需要一隻鴨子上臺表演,但你只有一隻火雞,所以你將火雞打扮成鴨子上臺表演了。
UserInfoDemo公司員工資訊案例:
人公司員資訊系統管理所有員工的所有資訊:使用者姓名、家庭地址、辦公電話、職位等。現在系統升級要能夠管理公司借用的勞務公司人員資訊,勞動服務公司是把人員資訊分為:基本資訊、辦公資訊和個人家庭資訊。
MonkDemo魯智深出家當和尚案例(預設介面卡):
和尚需要吃齋、唸經、打坐、撞鐘、習武,但魯智深出家後只習武,其它戒律確並不遵守,如何程式碼實現花和尚。
第四篇:總結
介面卡模式的用意是要改變源的介面,以便於和目標介面相容。
類介面卡和物件介面卡:介面卡模式根據實現不同可分為類介面卡和物件介面卡兩種。
類介面卡與物件介面卡對比:
1)類介面卡使用繼承的方式,是靜態的定義方式;而物件介面卡使用物件組合的方式,是動態組合的方式。
2)對於類介面卡,介面卡繼承自Adaptee,使得介面卡不能和Adaptee的子類或者兄弟類一起工作,繼承是靜態的,程式執行過程中無法改變。
3)對於物件介面卡,一個介面卡可以把源類和它的子類都適配到目標介面,因為組合是動態的,程式執行過程中可以修改。
4)對於類介面卡,可以重定義Adaptee的部分行為,通過子類覆蓋父類的實現方法。而物件適配重定義Adaptee的行為比較困難,只能進行一些新增。 建議儘量使用物件介面卡的實現方式,多用組合,少用繼承。
介面卡模式的優點:
1)更好的複用性;系統需要使用現有的類,而此類的介面不符合系統的需要,可以通過介面卡可以讓這些功能得到複用。
2)更好的擴充套件性;在實現介面卡的功能的時候,可以對適配的介面進行擴充套件。
3)介面卡模式可以讓兩個沒有任何關係的類在一起執行。
4)增加了類的透明性,訪問的是Target目標角色,實際具體實現委託給了Adaptee源角色,而這些對高層模組呼叫者是透明的。
介面卡模式的缺點:
過多的使用介面卡,會讓系統非常零亂,不易整體進行把握。比如呼叫A介面,其實內部被適配成B的介面實現。
使用場景:
修改一個已經投產中的介面時,介面卡模式可能是最適合你的模式。比如系統擴充套件了,需要使用一個已有或新建立的類,但這個類又不符合系統的介面。
注意事項:
介面卡模式最好在詳細設計階段不要考慮它,它不是為了解決還處在開發階段的問題,而是解決正在服役的專案問題。
預設介面卡:為一個介面提供預設實現,這樣子型別可以從這個預設實現進行擴充套件,而不必從原有接中進行擴充套件。
適用場景:在一些情況下,必須讓一個具體類實現某一個介面,但是又用不到介面所規定的所有方法。
預設介面卡很好的處理這一情況,設計一個抽象的介面卡類實現介面,此抽象類給介面的所有方法提供一個空的方法。任何繼承自抽象類的具體類都可以選擇它所需要的方法進行實現,而不需要理會其它方法。
預設介面卡的用意是為了方便建立一個不平庸的類而提供的一種平庸實現。