設計模式-適配者模式

葉少磐發表於2019-04-14

引言

今天是418旅遊節,我也出門去玩玩,突然看到一個外國友人在問路,然而他問的那個人似乎聽不懂他在說啥,我走上前去,憑著蹩腳的口語成功幫助了外國友人,感覺自己胸前的紅領巾更亮了。

正文

介面卡模式就是將原本兩個不相容的介面,通過某種方式使其能夠共同工作。介面卡模式也分為類結構性模式和物件結構性模式。前者相比後者耦合度高,並且需要開發者瞭解其內部的相關結構,故應用較少。

核心思想

通過介面卡,開發者可以重用原有的程式碼,無需修改即可呼叫。同時將目標介面和適配者解耦,解決了目標介面和適配者不一致的問題。

程式碼實現

講解

//目標介面
public interface Target {
    public void request();
}
複製程式碼
//適配者
public class Apdatee {
    public void specificRequest(){
        System.out.println("適配者的函式被呼叫");
    }
}
複製程式碼
//類介面卡
public class Adapter extends Apdatee implements Target {
    @Override
    public void request() {
        specificRequest();
    }
}
複製程式碼
//物件介面卡
public class ObjectAdapter implements Target {

    private Adaptee adaptee;

    public ObjectAdapter(Adaptee adaptee){
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}
複製程式碼
//呼叫
public class Client {
    public static void main(String[] args) {
        //類介面卡模式
        Target target = new Adapter();
        target.request();

        //物件介面卡模式
        Adaptee adaptee = new Adaptee();
        Target target = new ObjectAdapter(adaptee);
        target.request();
    }
}
複製程式碼

例項

在引言部分中,問路是目標,外國友人是適配者,我就充當的是介面卡的角色,負責將外語翻譯給路人聽。

public interface AskWayTarget {
    public void askWay();
}
複製程式碼
public class ForeignerAdaptee {
    public void specificAskWay(){
        System.out.println("我想知道去瘦西湖怎麼走?");
    }
}
複製程式碼
//類介面卡
public class MeAdapter extends ForeignerAdaptee implements AskWayTarget {
    @Override
    public void askWay() {
        specificAskWay();
    }
}
複製程式碼
//物件介面卡
public class MeObjectAdapter implements AskWayTarget {

    ForeignerAdaptee foreignerAdaptee ;

    public MeObjectAdapter(ForeignerAdaptee adaptee){
        this.foreignerAdaptee = adaptee;
    }

    @Override
    public void askWay() {
        foreignerAdaptee.specificAskWay();
    }
}
複製程式碼
public class Main {
    public static void main(String[] args) {
        //物件介面卡模式
        ForeignerAdaptee foreignerAdaptee = new ForeignerAdaptee();
        MeObjectAdapter meObjectAdapter = new MeObjectAdapter(foreignerAdaptee);
        meObjectAdapter.askWay();

        //類介面卡模式
        AskWayTarget askWayTarget = new MeAdapter();
        askWayTarget.askWay();
    }
}
複製程式碼

輸出結果

我想知道去瘦西湖怎麼走?
複製程式碼

總結

介面卡模式很好的解決了目標和適配者之間不匹配的問題。它適用於那些在使用第三方提供的元件時,其介面定義和自己所需要的介面定義不一致的問題。此外,介面卡還可以擴充為雙向介面卡模式,只需要把適配者也定義為一個介面即可,在此不做贅述,有興趣可自行實現。

相關文章