介面卡模式的理解和示例
阿新 • • 發佈:2019-08-02
一、是什麼
1. 定義:封裝物件,並提供不同的介面,主要目的是讓原來不相容的兩個介面協同工作
2. 分類: 類介面卡、物件介面卡、介面介面卡
3. 使用場景:
- 將現有的不相容的類,轉化成我們需要的類
4. 角色
- 目標介面:Target,該角色把其他類轉換為我們期望的介面
- 被適配者: Adaptee 原有的介面,也是希望被改變的介面
- 介面卡: Adapter, 將被適配者和目標介面組合到一起的類
4. 類圖
物件介面卡,使用組合
類介面卡,在java中實現不了,需要多重繼承才能實現,類圖是這個樣子的,當然如果變通一下,Target是介面就可以了
介面介面卡
介面介面卡的使用場景: 原有介面有很多方法,而我們只需要其中一部分,這是看可以用抽象類來實現該介面,不需要的方法只需要寫個空方法(預設實現)就好了,介面目標類去實現自己需要的介面
適用的場景是不想實現原有類的所有方法
二、示例
程式碼場景: 膝上型電腦只能使用三項充電,而牆上的插頭是二項的,所以我們需要一個轉換頭,將二項轉成三項
2.1.1 Adaptee 原有的類
/** * 插頭 二項供電 Adaptee */ public class TwoPower { public void powerByTwo() { System.out.println("提供二項供電"); } }
2.1.2 Target 目標類
/** * 插頭提供三項供電 (target) */ public interface ThreePower { /** * 三項供電 */ void powerByThree(); }
2.1.3 物件介面卡,轉換類 Adapter
/** * 二項轉三項的介面卡 組合的方式 物件介面卡 */ public class TwoToThreeAdapter implements ThreePower{ /** * 使用委託來完成適配 */ private TwoPower twoPower; public TwoToThreeAdapter(TwoPower twoPower) { this.twoPower = twoPower; } @Override public void powerByThree() { System.out.println("藉助組合介面卡轉化二項電"); twoPower.powerByTwo(); } }
2.1.4 類介面卡 轉換類 Adapter
/** * 二項轉三項的介面卡 繼承的方式 類 */ public class TwoToThreeAdapter2 extends TwoPower implements ThreePower { @Override public void powerByThree() { System.out.println("藉助繼承介面卡轉化二項電"); this.powerByTwo(); } }
測試
/** * 膝上型電腦 這是使用組合模式的-介面卡模式 */ public class NoteBook { /** * 期望的三項供電介面 */ private ThreePower threePower; public NoteBook(ThreePower threePower) { this.threePower = threePower; } public static void main(String[] args) { // ============================ 繼承方式的介面卡使用 類介面卡 ===================================== ThreePower threePower1 = new TwoToThreeAdapter2(); NoteBook noteBook1 = new NoteBook(threePower1); noteBook1.recharge(); noteBook1.work(); // ============================ 組合方式的介面卡使用 物件介面卡 ===================================== // 現在只有二項供電 TwoPower twoPower = new TwoPower(); ThreePower threePower = new TwoToThreeAdapter(twoPower); NoteBook noteBook = new NoteBook(threePower); // 1. 充電 noteBook.recharge(); // 2. 工作 noteBook.work(); } public void work() { System.out.println("膝上型電腦開始工作!"); } public void recharge() { // 使用三項充電 threePower.powerByThree(); } }
控制檯顯示:
提供二項供電
藉助繼承介面卡轉化二項電
膝上型電腦開始工作!
提供二項供電
藉助組合介面卡轉化二項電
膝上型電腦開始工作!
三、總結
這裡說些缺點吧,過多的使用介面卡,的確會讓程式看起來很難懂,我的理解是,在適配別人介面和其他API介面時,介面卡的用處就