Java設計模式(1)適配器模式(結構型)

2019年阿里雲雙11活動拼團:https://www.aliyun.com/1111/2019/group-buying-share

適配器模式屬於結構型模式的一種,它可以理解爲現實生活中的電源適配器、網絡適配器等。首先要搞清楚什麼是結構型模式。

結構型模式是將系統中的多個類或對象組合在一起,相互協作來完成更復雜的任務或功能。就好比搭積木,許多簡單積木可以搭建成更復雜、功能更強大的結構。它分爲兩種形式:類結構型模式和對象結構型模式。類結構型模式由多個類組合,存在繼承和實現關係;對象結構型模式由類和對象組合,存在關聯關係(比如車和輪胎的關係)。

下面我們再介紹適配器模式:

1、定義:將一個類的接口轉化成多個類可以兼容的接口,使其協同工作而無需修改現有類的內部結構。

2、模式結構:

(1)Target(目標抽象類):定義了特定的工作接口。

(2)Adapter(適配器類):模式的核心類,作爲轉換器對Target和Adaptee進行適配。

(3)Adaptee(適配者類):定義了需要適配的接口。

(4)Client(客戶類):針對目標抽象類編程,調用其定義的方法。

3、類適配器和對象適配器的比較:

類適配器中,適配器類通過實現Target接口並繼承Adaptee類,實現適配目的。

public class Adapter extends Adaptee implements Target

{

//request()方法爲Target接口裏所定義的方法

    public void request()

    {

        specificRequest();//該方法爲Adaptee類裏定義的方法

    }

}

對象適配器中,適配器類通過繼承Target類並關聯一個Adaptee對象,實現適配目的。

public class Adapter extends Target

{

    private Adaptee adaptee;//所關聯的適配者類的對象

    public Adapter(Adaptee adaptee)

    {

        this.adaptee=adaptee;

    }

    public void request()

    {

        adaptee.specificRequest();

    }

}

4、案例分析:(機器人)使用的是類適配器模式

(1)目標抽象類 Robot

public interface Robot

{

    public void cry();

    public void move();

}

(2)適配者類 Dog

public class Dog

{

    public void shout()

    {

        System.out.println("狗可以汪汪叫!");

    }

    public void run()

    {

        System.out.println("狗可以跑!");

    }

}

(3)適配器類 DogAdapte

public class DogAdapter extends Dog implements Robot

{

    public void cry(){

        System.out.print("機器人模仿:");

        super.shout();

    }

    public void move(){

        System.out.print("機器人模仿:");

        super.run();

    }

}

5、模式優缺點:

(1)優點:將目標類和適配者類解耦,更換添加適配器方便簡單,增加了類的複用性。

(2)缺點:類適配器模式一次只能適配一個適配者類,目標抽象類只能爲接口,具有一定的侷限性;對象適配器模式很難置換適配者類的方法。

6、模式應用:

(1)通過 JDBC 連接數據庫時加載數據庫驅動利用了適配器模式。不同數據庫的驅動都是介於 JDBC 接口和數據庫引擎接口(如Oracle)之間的適配器軟件。

(2)框架 Spring 的組成之一 Spring AOP 中,BeforeAdvice、AfterAdvice、ThrowsAdvice 三種通知類型是藉助適配器模式實現的,AdvisorAdapter 是一個適配器接口,源碼如下:

public interface AdvisorAdapte

{

    //將一個 Advisor 適配成 MethodIntercepto

    MethodInterceptor getInterceptor(Advisor advisor);

    //判斷此適配器是否支持特定的 Advice

    boolean supportsAdvice(Advice advice);

}

(3)JDK類庫中n的一些適配器類,如 InputStreamAdapter 類用於包裝 ImageInputStream 接口及其子類對象,使用對象適配器模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章