1. 程式人生 > >java23種設計模式——六、介面卡模式

java23種設計模式——六、介面卡模式

原始碼在我的[github](https://github.com/witmy/JavaDesignPattern)和[gitee](https://gitee.com/witmy/JavaDesignPattern)中獲取 # 目錄 [java23種設計模式—— 一、設計模式介紹](https://www.cnblogs.com/codermy/p/13565137.html) [java23種設計模式—— 二、單例模式](https://www.cnblogs.com/codermy/p/13566365.html) [java23種設計模式——三、工廠模式](https://www.cnblogs.com/codermy/p/13569486.html) [java23種設計模式——四、原型模式](https://www.cnblogs.com/codermy/p/13571750.html) [java23種設計模式——五、建造者模式](https://www.cnblogs.com/codermy/p/13575590.html) [java23種設計模式——六、介面卡模式](https://www.cnblogs.com/codermy/p/13577408.html) ## 介紹 介面卡模式(Adapter Pattern)是作為兩個不相容的介面之間的橋樑。這種型別的設計模式屬於結構型模式,它結合了兩個獨立介面的功能。 這種模式涉及到一個單一的類,該類負責加入獨立的或不相容的介面功能。舉個真實的例子,現在我們很多手機沒有了耳機的插孔,只留下了type-c的插口,如果我們想使用有線耳機的話就要買一個耳機轉type-c的轉換器 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200725122109343.png#pic_center) ## 應用場景 系統需要使用現有的類,而此類的介面不符合系統的需要。 想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作,這些源類不一定有一致的介面。 通過介面轉換,將一個類插入另一個類系中。 ## 優缺點 - 優點 1、可以讓任何兩個沒有關聯的類一起執行。 2、提高了類的複用。 3、增加了類的透明度。 4、靈活性好。 - 缺點 1、過多地使用介面卡,會讓系統非常零亂,不易整體進行把握。比如,明明看到呼叫的是 A 介面,其實內部被適配成了 B 介面的實現,一個系統如果太多出現這種情況,無異於一場災難。因此如果不是很有必要,可以不使用介面卡,而是直接對系統進行重構。 2.由於 JAVA 至多繼承一個類,所以至多隻能適配一個適配者類,而且目標類必須是**抽象類**。 ## 模式實現 介面卡模式有如下三個個角色: - **源(Adaptee)**:目標抽象類定義客戶所需介面,可以是一個抽象類或介面,也可以 是具體類,相當於typec線。 - **介面卡(Adapter)**:連線目標和源的中間物件,可以呼叫另一個介面,作為一個轉換器。相當於耳機轉typec轉換器。 - **目標(Target)**:即被適配的角色,相當於手機。 ​ 首先我們有一個手機類,有一個typec介面預設可以充電 ```java /** * @author codermy * @createTime 2020/7/25 */ public class Phone { public String throwTypec(){ System.out.println("使用了typec介面"); return "充電"; } } ``` 有一個耳機可以放音樂 ```java /** * @author codermy * @createTime 2020/7/25 */ public interface Headset { String music(); } ``` 現在買了一個轉換器可以讓有線耳機連結手機 ```java /** * @author codermy * @createTime 2020/7/25 * 轉換器 */ public class Converter implements Headset { private Phone phone; public Converter(Phone phone){ this.phone = phone; } @Override public String music() { String s = phone.throwTypec(); System.out.println(String.format("%s -------------- > %s",s,"聽歌")); return "聽歌"; } } ``` 使用者使用轉接器 ```java /** * @author codermy * @createTime 2020/7/25 */ public class Client { public static void main(String[] args) { Phone phone = new Phone(); Headset headset = new Converter(phone); headset.music(); } } ``` 輸出 ```bash 使用了typec介面 充電 -------------- > 聽