1. 程式人生 > 實用技巧 >設計模式隨筆(六):介面卡模式

設計模式隨筆(六):介面卡模式

概述

  以電源插座為例,有三孔插頭和二孔插頭,各個國家標準不一,國外版筆記本如果想在國內插上插頭充電,我們肯定都會準備一個轉接頭將三孔插頭/二孔插頭轉為跟筆記本電源插頭來匹配,充上電。這是我們生活中的介面卡。

  在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();
    }
}