設計模式隨筆(六):介面卡模式
阿新 • • 發佈:2020-11-02
概述
以電源插座為例,有三孔插頭和二孔插頭,各個國家標準不一,國外版筆記本如果想在國內插上插頭充電,我們肯定都會準備一個轉接頭將三孔插頭/二孔插頭轉為跟筆記本電源插頭來匹配,充上電。這是我們生活中的介面卡。
在java中,我們把一個類的介面轉換成客戶端想要的另一個介面(也就是把國內插孔,轉為國外插孔),把因為介面不相容而不能在一起工作的類,通過介面卡(Adapter),是他們能夠在一起工作。
UML
把適配的類的API,轉為目標類的API
類介面卡
Client想要呼叫-op2方法,但Adaptee並沒有提供這個方法,為了使Target能提供-op2這個方法,新增一箇中間環節Adapter類繼承Adaptee,實現Target介面。因為Adapter和Adaptee是繼承關係,決定這個介面卡是類介面卡
建立Targe介面
interface Target { //這是源類Adapteee沒有的方法 void operation_2(); }
建立原類
class Adaptee { public void opration_1() { } }
建立介面卡類
//介面卡Adapter繼承自Adaptee,同時又實現了目標(Target)介面。 class Adapter extends Adaptee implements Target { //這裡的介面卡只是將opration_1()方法作了一層封裝,封裝成Target可以呼叫的opration_2()而已 @Override public void opration_2() { this.opration_1(); } }
Client呼叫
public class Test{ public static void main(String[] args) { Target mAdapter = new Adapter(); mAdapter.opration_2(); } }
物件介面卡
Adapter和Adaptee不再使用繼承關係,而是通過委派關係連線到Adapter
建立Target介面和Adaptee源類與類介面卡模式相同,不同點在於Adapter程式碼。
class Adapter implements Target{ // 直接關聯被適配類 private Adaptee adaptee; // 可以通過建構函式傳入具體需要適配的被適配類物件 public Adapter (Adaptee adaptee) { this.adaptee = adaptee; } @Override public void operation_2() { // 這裡是使用委託的方式完成特殊功能 this.adaptee.opration_1(); } }
Client呼叫
public class AdapterPattern { public static void main(String[] args) { // 步驟4:定義具體使用目標類,並通過Adapter類呼叫所需要的方法從而實現目標 //需要先建立一個被適配類的物件作為引數 Target mAdapter = new Adapter(new Adaptee()); mAdapter.operation_2(); } }