1. 程式人生 > >適配器模式(2)

適配器模式(2)

圖片 調用 per 繼承 關系 同時 int 對象適配器 pan

適配器模式的定義:將一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠一起工作。

圖解

A、B兩個圖框代表已經塑模成型的物體A和物體B,現在要求把A和B安裝在一起使用,如何安裝?兩者的接口不一致,是不可能安裝在一起使用的,那怎麽辦?引入一個物體C,如下:

技術分享圖片

引入物體C後,C適應了物體A的接口,同時也適應了物體B的接口,然後三者就可以組合成一個完整的物體;其中物體C就是適配器。

適配器模式的三個角色

Target目標角色:客戶端所調用的接口;

Adaptee源角色:你想把誰轉換成目標角色,這個誰就是Adaptee;

Adapter適配器角色:適配器模式的核心角色,其他兩個角色都是已經存在的角色,而適配器角色是需要新建立的,他的職責非常簡單:把源角色轉換為目標角色(通過類繼承或者類關聯的方式);

適配器模式的兩種情況

類適配器:類適配器是類間繼承;

Target角色:

public interface Target {
    /**
     * 目標角色已有的方法
     */
    void request();
}
public class ConcreteTarget implements Target {
    @Override
    public void request() {
        System.out.println("If you need any help,pls call me!");
    }
}

Adaptee源角色:

public class Adaptee {
    /**
     * 原有的業務邏輯
     */
    public void doSomething(){
        System.out.println("I‘m kind of busy,leave me alone,pls!");
    }
}

Adapter適配器角色:

public class Adapter extends Adaptee implements Target {

    @Override
    public void request() {
        
super.doSomething(); } }

客戶端調用:

public class Client {

    public static void main(String[] args) {
        //原有的業務邏輯
        Target target = new ConcreteTarget();
        target.request();//If you need any help,pls call me!
        //增加適配器後的邏輯
        Target target1 = new Adapter();
        target1.request();//I‘m kind of busy,leave me alone,pls!
    }
}

對象適配器:是對象的合成關系,也可以說是類的關聯關系(用到的場景較多)

Target角色和Adaptee源角色同類適配器一樣,此處省略,唯一不一樣的地方在於適配器類Apdater的編寫

Adapter適配器:

public class Adapter implements Target {
    /**
     * 此處本應使用接口接收,但是源角色只有類,沒有接口,故使用類
     */
    private Adaptee adaptee = null;
    
    public Adapter(Adaptee adaptee){
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        adaptee.doSomething();
    }
}

適配器模式的註意事項

適配器模式最好在詳細設計階段不要考慮它,他不是為了解決還處在開發階段的問題,而是解決正在服役的項目問題;還有一點,項目一定要遵守依賴倒置原則和裏氏替換原則,否則即使再適合使用適配器的場合下,也會帶來非常大的改造

適配器模式(2)