1. 程式人生 > >設計模式-介面卡模式(Adapter)

設計模式-介面卡模式(Adapter)

概述

  • 定義 : 將一個類的介面轉換成客戶期望的另一個介面

  • 使原本不相容的類可以一起工作

  • 型別 : 結構型

適用場景

  • 已經存在的類, 它的方法和需求不匹配時(方法結果相同或相似)
  • 不是軟體設計階段考慮的設計模式, 而是隨著軟體維護, 由於不同產品, 不同廠家造成功能類似而介面不相同情況下的解決方案

優點

  • 能提高類的透明性和複用, 現有的類複用但不需要改變
  • 目標類和介面卡類解耦, 提高程式擴充套件性
  • 符合開閉原則

缺點

  • 介面卡編寫過程需要全面考慮, 可能會增加系統的複雜性
  • 增加系統可讀的難度

分類

  • 類介面卡, 使用繼承
  • 物件介面卡, 使用組合

模式角色

  • Target : 定義C l i e n t使用的與特定領域相關的介面
  • Client : 客戶端, 與符合Target 介面的物件協同
  • Adaptee : 定義一個已經存在的介面,這個介面需要適配
  • Adapter : 對A d a p t e e的介面與Target 介面進行適配

程式碼實現

類介面卡

UML類圖 :
在這裡插入圖片描述
Adaptee程式碼:

/**
 * 被適配的類
 *
 * @author 七夜雪
 * @create 2018-11-23 16:13
 */
public class Adaptee { public void AdapteeRequest(){ System.out.println("被適配的類方法..."); } }

Target介面:

/**
 * @author 七夜雪
 * @create 2018-11-23 16:12
 */
public interface Target {
    public void request();
}

Target實現, 用於做對比, 程式碼如下:

/**
 * Target的一個實現類
 * @author 七夜雪
 * @create 2018-11-23 16:14
 */
public class TargetImpl implements Target { @Override public void request() { System.out.println("TargetImpl 方法..."); } }

介面卡Adapter類 :

/**
 * 介面卡類
 *
 * @author 七夜雪
 * @create 2018-11-23 16:15
 */
public class Adapter extends Adaptee implements Target {
    @Override
    public void request() {
        super.AdapteeRequest();
    }
}

測試程式碼:

    public static void main(String[] args) {
        Target target = new TargetImpl();
        target.request();
        target = new Adapter();
        target.request();
    }

測試結果:

TargetImpl 方法…
被適配的類方法…

物件介面卡

UML類圖:
在這裡插入圖片描述

程式碼除了Adapter類之外, 其他均與類介面卡一樣, Adapter程式碼如下:

/**
 * 介面卡類
 *
 * @author 七夜雪
 * @create 2018-11-23 16:15
 */
public class Adapter implements Target {
    private Adaptee adaptee = new Adaptee();
    @Override
    public void request() {
     adaptee.AdapteeRequest();
    }
}
  • 類介面卡和物件介面卡的區別就是類介面卡使用繼承來實現, 而物件介面卡則使用組合來實現

本文參考:
慕課網<java設計模式精講 Debug 方式+記憶體分析>課程
四人幫<設計模式>