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