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