1. 程式人生 > >Java設計模式--適配器模式

Java設計模式--適配器模式

obj implement tar ron 關系 col 而是 target blog

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

適配器有兩種形式:類的適配器和對象的適配器。

類的適配器模式

結構圖:

技術分享

可以看出,Adaptee並沒有operateB,而客戶端期待這個方法。為了讓客戶端能使用Adaptee類,增加了一個中間環節,即類Adapter,把Adaptee的API和Target類的API銜接起來。Adapter和Adaptee是繼承關系,這決定了這個適配器模式是類的。

角色:

目標角色:所期待得到的接口--Target

源角色:現需要適配的接口--Adaptee

適配器角色:適配器把源接口轉換成目標接口

package com.design.adapter.classadapter;

public interface Target {

    void operateA();

    void operateB();

}

Adaptee

package com.design.adapter.classadapter;

public class Adaptee {

    public void operateA(){

    }

}

Adapter

package com.design.adapter.classadapter;

public class Adapter extends
Adaptee implements Target { @Override public void operateB() { } }

對象的適配器模式

結構圖:

技術分享

與類的適配器模式不同的是,對象的適配器模式不是使用繼承關系連接到Adaptee類,而是使用委派關系連接到Adaptee類。

Adaptee中沒有operateB方法,而客戶端期待這個方法。為了使客戶端能夠使用Adaptee類,需要一個適配器類。這個適配器類包裝了一個Adaptee的實例,從而使Adaptee的API能夠和Target的API連接起來。Adaptee和Adapter類是為委派關系,決定了這個適配器模式是對象的。

Target

package com.design.adapter.objectadapter;

public interface Target {

    void operateA();

    void operateB();
}

Adaptee

package com.design.adapter.objectadapter;

public class Adaptee {
    
    public void operateA(){
        
    }
}

Adapter

package com.design.adapter.objectadapter;

public class Adapter implements Target {

    private Adaptee adaptee;

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

    /**
     * 源類有A方法,所以直接委派即可
     */
    @Override
    public void operateA() {
        adaptee.operateA();
    }

    /**
     * 源類沒有此方法,需要適配器實現
     */
    @Override
    public void operateB() {

    }
}

說明

適配器模式的用意是將接口不同而功能相近的兩個接口加以轉換,在這裏包括了適配器角色補充了一個源角色咩有的方法。不要誤以為適配器模式就是為了補充源角色沒有的方法而準備的。

Java設計模式--適配器模式