設計模式-介面卡模式(Adapter)
阿新 • • 發佈:2018-11-24
概述
-
定義 : 將一個類的介面轉換成客戶期望的另一個介面
-
使原本不相容的類可以一起工作
-
型別 : 結構型
適用場景
- 已經存在的類, 它的方法和需求不匹配時(方法結果相同或相似)
- 不是軟體設計階段考慮的設計模式, 而是隨著軟體維護, 由於不同產品, 不同廠家造成功能類似而介面不相同情況下的解決方案
優點
- 能提高類的透明性和複用, 現有的類複用但不需要改變
- 目標類和介面卡類解耦, 提高程式擴充套件性
- 符合開閉原則
缺點
- 介面卡編寫過程需要全面考慮, 可能會增加系統的複雜性
- 增加系統可讀的難度
分類
- 類介面卡, 使用繼承
- 物件介面卡, 使用組合
模式角色
- 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 方式+記憶體分析>課程
四人幫<設計模式>