1. 程式人生 > >淺談Java設計模式——介面卡模式(Adapter)

淺談Java設計模式——介面卡模式(Adapter)

一、概述

        將一個類的介面轉換成客戶希望的另外一個介面。Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。在我們的應用程式中我們可能需要將兩個不同介面的類來進行通訊,在不修改這兩個的前提下我們可能會需要某個中介軟體來完成這個銜接的過程。這個中介軟體就是介面卡。所謂介面卡模式就是將一個類的介面,轉換成客戶期望的另一個介面。它可以讓原本兩個不相容的介面能夠無縫完成對接。作為中介軟體的介面卡將目標類和適配者解耦,增加了類的透明性和可複用性。

二、使用場景

1.你想使用一個已經存在的類,而它的介面不符合你的需求。 

2.你想建立一個可以複用的類,該類可以與其他不相關的類或不可預見的類(即那些介面 可能不一定相容的類)協同工作。 

3.(僅適用於物件Adapter)你想使用一些已經存在的子類,但是不可能對每一個都進行 子類化以匹配它們的介面。物件介面卡可以適配它的父類介面。

四、參與者

1.Target 定義Client使用的與特定領域相關的介面。 

2.Client 與符合Target介面的物件協同。 

3.Adaptee 定義一個已經存在的介面,這個介面需要適配。

4.Adapter 對Adaptee的介面與Target介面進行適配

五、類圖

六、示例程式碼

1.Target:

/**
 * Target介面
 * @author zhipeng_Tong
 */
public interface Player {
    void attach();

    void defense();
}

2.Adapter:

public class Forward implements Player {
    private String name;

    public Forward(String name) {
        this.name = name;
    }

    @Override
    public void attach() {
        System.out.println(String.format("前鋒 %s 進攻", name));
    }

    @Override
    public void defense() {
        System.out.println(String.format("後衛 %s 防守", name));
    }
}
/**
 * Adapter
 * @author zhipeng_Tong
 */
public class Translator implements Player {
    private ForeignCenter foreignCenter;

    public Translator(String foreignCenter) {
        this.foreignCenter = new ForeignCenter(foreignCenter);
    }

    @Override
    public void attach() {
        foreignCenter.attach();
    }

    @Override
    public void defense() {
        foreignCenter.defense();
    }
}

3.Adaptee:

/**
 * Adaptee
 * @author zhipeng_Tong
 */
public class ForeignCenter {
    private String name;

    public ForeignCenter(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void attach() {
        System.out.println(String.format("外籍中鋒 %s 進攻", name));
    }

    public void defense() {
        System.out.println(String.format("外籍中鋒 %s 防守", name));
    }
}

4.測試程式碼:

public class Client {
    public static void main(String[] args) {
        Player forward = new Forward("巴蒂爾");
        forward.attach();

        Player foreignCenter = new Translator("姚明");
        foreignCenter.attach();
        foreignCenter.defense();
    }
}

執行結果:

前鋒 巴蒂爾 進攻
外籍中鋒 姚明 進攻
外籍中鋒 姚明 防守