摘要:定義和類型定義將一個類的接口轉(zhuǎn)換成客戶期望的另一個接口,適配器模式讓那些不兼容的類可以一起工作。類型結(jié)構(gòu)型類適配器模式類適配器模式使用繼承的方式去實現(xiàn)接口適配。它是適配器模式的核心。
0x01.定義和類型
定義:將一個類的接口轉(zhuǎn)換成客戶期望的另一個接口,適配器模式讓那些不兼容的類可以一起工作。
類型:結(jié)構(gòu)型
a.類適配器模式類適配器模式:使用繼承的方式去實現(xiàn)接口適配。
UML:
Java實現(xiàn)
/** * 客戶需要的接口 */ public interface Target { void request(); } /** * 被適配的類 */ public class Adaptee { public void adapteeRequest () { System.out.println("被適配者的方法"); } } /** * 適配器,繼承了被適配的類,并且實現(xiàn)了Target定義的接口 */ public class Adapter extends Adaptee implements Target { @Override public void request() { //todo... System.out.println("適配后----"); super.adapteeRequest(); //todo... } }
測試與應(yīng)用
/** * 測試類 */ public class Test { public static void main(String[] args) { Adaptee adaptee = new Adaptee(); adaptee.adapteeRequest(); Target adapterTarget = new Adapter(); adapterTarget.request(); } }
輸出結(jié)果
被適配者的方法 適配后---- 被適配者的方法b.對象適配器模式
對象適配器模式:使用組合的方式去實現(xiàn)接口適配
UML
Java實現(xiàn)
/** * 客戶端應(yīng)用放使用的接口 */ public interface Target { void request(); } /** * 被適配的類 */ public class Adaptee { public void adapteeRequest () { System.out.println("被適配者的方法"); } } /** * 適配器模式 */ public class Adapter implements Target { /** * 組合了被適配的類,這里可以通過set方式注入 */ private Adaptee adaptee = new Adaptee(); @Override public void request() { //todo... System.out.println("適配后----"); adaptee.adapteeRequest(); //todo... } }
應(yīng)用與測試類
/** * 應(yīng)用測試類 */ public class Test { public static void main(String[] args) { Adaptee adaptee = new Adaptee(); adaptee.adapteeRequest(); Target adapterTarget = new Adapter(); adapterTarget.request(); } }
輸入結(jié)果
被適配者的方法 適配后---- 被適配者的方法c.角色介紹
從上面兩種情況可以看出,適配器模式一共有三個角色
Target(目標(biāo)抽象類):目標(biāo)抽象類定義客戶所需的接口,可以是一個抽象類或接口,也可以是具體類。
Adapter(適配器類):它可以調(diào)用另一個接口,作為一個轉(zhuǎn)換器,對Adaptee和Target進(jìn)行適配。它是適配器模式的核心。
Adaptee(適配者類):適配者即被適配的角色,它定義了一個已經(jīng)存在的接口,這個接口需要適配,適配者類包好了客戶希望的業(yè)務(wù)方法。
0x02.適用場景已經(jīng)存在的類,它的方法和需求不匹配時(方法結(jié)果相同或相似)
創(chuàng)建一個可以重復(fù)使用的類,用于和一些彼此之間沒有太大關(guān)聯(lián)的類,包括一些可能在將來引進(jìn)的類一起工作
適配器模式不是軟件設(shè)計階段考慮的設(shè)計模式,是隨著軟件維護(hù),由于不同產(chǎn)品,不同廠家造成功能類似而接口不相同情況下的解決方案。
0x03.優(yōu)點能提高類的透明性和復(fù)用,將具體的業(yè)務(wù)實現(xiàn)過程封裝在適配者類中,對于客戶端類而言是透明的,現(xiàn)有的類復(fù)用但不需要改變,而且提高了適配者的復(fù)用性,同一適配者類可以在多個不同的系統(tǒng)中復(fù)用。
目標(biāo)類和適配器類解耦,通過引入一個適配器類來重用現(xiàn)有的適配者類,無需修改原有結(jié)構(gòu),提高程序擴(kuò)展性。
靈活性和擴(kuò)展性都非常好,通過使用配置文件,可以很方便的更換適配器,也可以在不修改原有代碼的基礎(chǔ)上,增加新的適配器,符合開閉原則。
0x04.缺點適配器編寫過程需要全面考慮,可能會增加系統(tǒng)的復(fù)雜性。
一次最多只能適配一個適配者類,不能同時適配多個適配者。
增加系統(tǒng)代碼可讀的難度。
0x05. 樣例實現(xiàn)筆記本的插頭為三項電,而現(xiàn)有的插座是兩項的,需要適配器來進(jìn)行適配,下面分別進(jìn)行兩種方式的實現(xiàn)。
通用代碼
/** * 三項插座接口 * @author Administrator * */ public interface ThreePlugIf { //使用三項電流供電 void powerWithThree(); } /** * 二項電插座 */ public class GBTowPlug { //使用二項電流供電 public void powerWithTwo () { System.out.println("使用二項電流供電"); } } /** * 筆記本類 */ public class NoteBook { private ThreePlugIf plug; /** * 只接收使用三項電充電 * @param plug */ public NoteBook (ThreePlugIf plug) { this.plug = plug; } /** * 使用插座充電 */ public void charge () { plug.powerWithThree(); } }a.類適配器的實現(xiàn)
具體Java代碼
/** * 采用繼承方式的插座適配器 * @author Administrator */ public class TwoPlugAdapterExtends extends GBTowPlug implements ThreePlugIf { public void powerWithThree() { System.out.println("借助繼承適配器"); this.powerWithTwo(); } }
測試與應(yīng)用類
/** * 測試與應(yīng)用類 */ public class AdapterTest { public static void main(String[] args) { ThreePlugIf three = new TwoPlugAdapterExtends(); NoteBook book = new NoteBook(three); book.charge(); } }
輸出結(jié)果
借助繼承適配器 使用二項電流供電
樣例UML類圖:
b.對象適配器的實現(xiàn)具體Java代碼
/** * 二項插座轉(zhuǎn)三項插座的適配器 */ public class TwoPlugAdapter implements ThreePlugIf { /** * 組合 */ private GBTowPlug plug; public TwoPlugAdapter (GBTowPlug plug) { this.plug = plug; } public void powerWithThree() { System.out.println("通過轉(zhuǎn)化"); plug.powerWithTwo(); } }
測試與應(yīng)用類
/** * 測試與應(yīng)用類 */ public class AdapterTest { public static void main(String[] args) { GBTowPlug two = new GBTowPlug(); ThreePlugIf three = new TwoPlugAdapter(two); NoteBook book = new NoteBook(three); book.charge(); } }
輸出結(jié)果
對象適配器-通過轉(zhuǎn)化 使用二項電流供電
樣例UML類圖:
0x06.相關(guān)設(shè)計模式
適配器模式和外觀模式
對現(xiàn)有的類現(xiàn)存系統(tǒng)的封裝
外觀:定義了新的接口,創(chuàng)建新的接口對現(xiàn)有接口的封裝
適配器:復(fù)用原有的接口,使兩個已有的接口協(xié)同工作
兩種:適配的力度不同,外觀針對的力度更大
0x07.源碼中的適配器JDK: XmlAdapter
Spring AOP: AdvisorAdapter, MethodBeforeAdvice
Spring Data JPA: JpaVendorAdapter
Spring MVC: Handler Adacpter
0x08.源碼地址適配器模式: https://github.com/sigmako/design-pattern/tree/master/adapter
0x09.參考慕課網(wǎng)設(shè)計模式精講: https://coding.imooc.com/class/270.html
設(shè)計模式:適配器模式: https://www.cnblogs.com/songyaqi/p/4805820.html
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/75601.html
摘要:本文參考于設(shè)計模式課程設(shè)計模式之適配器模式設(shè)計模式是一套被反復(fù)使用的多數(shù)人知曉的經(jīng)過分類編目的代碼設(shè)計經(jīng)驗的總結(jié)。第一個設(shè)計模式是適配器模式??偟膩碚f適配器就是的模式,與修飾模式直接無感使用不同,適配器模式使用對象變?yōu)椤? 本文參考于:設(shè)計模式課程設(shè)計模式之適配器模式 設(shè)計模式是一套被反復(fù)使用的、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。使用設(shè)計模式是為了重用代碼、讓代碼更容易被...
摘要:適配器模式之?dāng)?shù)據(jù)格式轉(zhuǎn)換適配器模式不僅可以起到適配接口名的作用,它另外還有一個功能就是能統(tǒng)一不同格式的作用。我們的目的就是在程序中,不要出現(xiàn)適配器模式,但考慮到實際,這也是不可能的,所以盡量將代碼設(shè)計符合規(guī)范是非常必要的。 這個模式應(yīng)該算是除了單例模式以外最簡單的一個模式,沒有多余的類,這個模式只有一個職責(zé),就是轉(zhuǎn)換的你接口參數(shù),歸一化接口調(diào)用函數(shù),同意參數(shù)格式。 說人話~其實就是,將...
摘要:舊接口格式和使用者不兼容,中間加一個適配器轉(zhuǎn)換接口。模式作用使用一個已經(jīng)存在的對象,但其方法或接口不符合你的要求。 原文博客地址:https://finget.github.io/2018/11/22/adapter/ 適配器模式 適配器模式(Adapter)是將一個類(對象)的接口(方法或?qū)傩?轉(zhuǎn)換成客戶希望的另外一個接口(方法或?qū)傩?,適配器模式使得原本由于接口不兼容而不能一起工作...
摘要:適配器模式將一個類的接口轉(zhuǎn)換為客戶期望的另一個接口。取桔子包裝準(zhǔn)備用途蘋果盒代替把蘋果盒適配成桔子包裝盒桔子包裝適配器適配器模式結(jié)構(gòu)圖用法繼承,同時組合對象引入成員變量使和產(chǎn)生關(guān)聯(lián)。 適配器模式:將一個類的接口轉(zhuǎn)換為客戶期望的另一個接口。適配器讓原本接口不兼容的類可以合作無間。 場景:水果店賣有橘子和蘋果,橘子用橘子包裝盒,蘋果用蘋果包裝盒,顧客A來買橘子,但是沒有橘子包裝盒了,則用蘋...
摘要:簡介適配器模式有時候也稱包裝樣式或者包裝將一個類的接口適配成用戶所期待的。應(yīng)用場景如程序數(shù)據(jù)庫有關(guān)聯(lián)等操作,而你需要根據(jù)情況換數(shù)據(jù)庫操作時,可以使用適配器模式統(tǒng)一接口,這樣代碼中除了數(shù)據(jù)庫配置之外,就不需要做而外的更改。 簡介 適配器模式(有時候也稱包裝樣式或者包裝)將一個類的接口適配成用戶所期待的。一個適配允許通常因為接口不兼容而不能在一起工作的類工作在一起。 UML 角色 Tar...
閱讀 1789·2021-09-26 09:55
閱讀 3844·2021-09-22 15:31
閱讀 8102·2021-09-22 15:12
閱讀 2273·2021-09-22 10:02
閱讀 4777·2021-09-04 16:40
閱讀 1119·2019-08-30 15:55
閱讀 3112·2019-08-30 12:56
閱讀 1871·2019-08-30 12:44