其實適配器這三個字大家應該很熟悉,我們知道蘋果公司的手機iPhone已經不提供充電插頭了,包裝盒內只有一條數據線,那麼我們無法單獨使用這條數據線進行在220V的插板上充電,因此我們需要重新購買一個轉接器來把插板和手機連接起來,這就是轉接器。
其實在軟體設計中也可能出現,需要開發的具有某種業務功能的元件在現有的元件庫中已經存在,但它們與目前系統的介面規格不相容,如果重新開發這些組件成本又很高,這時用適配器模式能很好地解決這些問題。
適配器模式: 將一個類別的接口轉換成客戶希望的另外一個接口,使得原本由於接口不相容而不能一起工作的那些類能一起工作。
適配器模式分為類別結構型模式和物件結構型模式兩種,前者類別之間的耦合度比後者高,且要求程式設計師了解現有元件庫中的相關元件的內部結構,所以應用相對較少。
優點:
#客戶端透過適配器可以透明地呼叫目標介面
復用了現存的類,程式設計師不需要修改原有程式碼而重用現有的適配者類別
將目標類別和適配者類別解耦,解決了目標類別和適配者類別介面不一致的問題
在許多業務場景中符合開閉原則
缺點:
適配器編寫過程需要結合業務場景全面考慮,可能會增加系統的複雜性
增加程式碼閱讀難度,降低程式碼可讀性,過度使用適配器會使系統程式碼變得凌亂
(以下結構參考自網際網路)
模式的結構:
目標(Target)介面: 目前系統業務所期待的接口,它可以是抽象類別或介面
物件適配器模式的結構: #5、適配器模式的程式碼實作A、使用組合的方式實現適配器:我們現在有一台筆記型電腦的插頭的三相的,但是我們現在需要使用二相的插頭進行充電,所以我們需要給這個插頭裝上一個二相的適配器: 三相插座介面:
/** * 三相插座接口 */ public interface ThreePlugIf { //使用三相电流供电 public void powerWithThree(); }國標的二相插座:
/** * 国标的二相插座 */ public class GBTowPlug { public void powerWithTwo(){ System.out.println("使用二相电流供电"); } }筆記本:
/** * 笔记本 */ public class NoteBook { private ThreePlugIf plug; public NoteBook(ThreePlugIf plug){ this.plug = plug; } //使用插座充电 public void charge(){ plug.powerWithThree(); } }三相轉二相的插座轉接器:
/** * 三相转二相的插座适配器 */ public class TwoPlugAdapter implements ThreePlugIf { private GBTowPlug plug; public TwoPlugAdapter(GBTowPlug plug) { this.plug = plug; } @Override public void powerWithThree() { System.out.println("通过转换"); plug.powerWithTwo(); } }測試類別:
public class Test { public static void main(String[] args) { GBTowPlug two = new GBTowPlug(); ThreePlugIf three = new TwoPlugAdapter(two); NoteBook nb = new NoteBook(three); nb.charge(); } }#輸出結果:
透過轉換#採用組合方式的適配器稱為物件適配器#特點:#將「被適配器」當作一個物件組合到適配器類別中,以修改目標介麵包裝給適配器B、使用繼承的方式實作適配器: #繼承適配器:使用二相電流供電
/** * 采用继承方式的插座适配器 */ public class TwoPlugAdapterExtends extends GBTowPlug implements ThreePlugIf{ @Override public void powerWithThree() { System.out.println("借助继承适配器"); this.powerWithTwo(); } }測試類別:
public class Test { public static void main(String[] args) { GBTowPlug two = new GBTowPlug(); ThreePlugIf three = new TwoPlugAdapter(two); NoteBook nb = new NoteBook(three); nb.charge(); //使用继承方法 three = new TwoPlugAdapterExtends(); nb = new NoteBook(three); nb.charge(); } }輸出:
透過轉換#採用繼承方式的稱為類別適配器特點:透過多重繼承不相容接口,實現對目標介面的匹配,單一的為某個類別而實現適配#6、適配器模式的應用場景使用二相電流供電
借助繼承適配器使用二相電流供電
以上是如何理解和使用Java適配器模式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!