首頁 >Java >java教程 >如何理解和使用Java適配器模式?

如何理解和使用Java適配器模式?

PHPz
PHPz轉載
2023-04-23 09:19:141448瀏覽

1、什麼是適配器模式?

其實適配器這三個字大家應該很熟悉,我們知道蘋果公司的手機iPhone已經不提供充電插頭了,包裝盒內只有一條數據線,那麼我們無法單獨使用這條數據線進行在220V的插板上充電,因此我們需要重新購買一個轉接器來把插板和手機連接起來,這就是轉接器。

其實在軟體設計中也可能出現,需要開發的具有某種業務功能的元件在現有的元件庫中已經存在,但它們與目前系統的介面規格不相容,如果重新開發這些組件成本又很高,這時用適配器模式能很好地解決這些問題。

2、適配器模式的定義

適配器模式: 將一個類別的接口轉換成客戶希望的另外一個接口,使得原本由於接口不相容而不能一起工作的那些類能一起工作。

適配器模式分為類別結構型模式和物件結構型模式兩種,前者類別之間的耦合度比後者高,且要求程式設計師了解現有元件庫中的相關元件的內部結構,所以應用相對較少。

3、適配器模式的優缺點

優點:

  • #客戶端透過適配器可以透明地呼叫目標介面

  • 復用了現存的類,程式設計師不需要修改原有程式碼而重用現有的適配者類別

  • 將目標類別和適配者類別解耦,解決了目標類別和適配者類別介面不一致的問題

  • 在許多業務場景中符合開閉原則

缺點:

  • 適配器編寫過程需要結合業務場景全面考慮,可能會增加系統的複雜性

  • 增加程式碼閱讀難度,降低程式碼可讀性,過度使用適配器會使系統程式碼變得凌亂

4、適配器模式的結構與實作

(以下結構參考自網際網路)

模式的結構:

  • 目標(Target)介面: 目前系統業務所期待的接口,它可以是抽象類別或介面

  • # #適配器(Adaptee)類別: 它是被存取和適應的現存元件庫中的元件介面

  • #適配器(Adapter)類別: 它是一個轉換器,透過繼承或引用適配器的對象,把適配器介面轉換成目標接口,讓客戶以目標接口的格式存取適配器

類別適配器模式的結構:

如何理解和使用Java適配器模式?

物件適配器模式的結構:

如何理解和使用Java適配器模式?

#5、適配器模式的程式碼實作

A、使用組合的方式實現適配器:

我們現在有一台筆記型電腦的插頭的三相的,但是我們現在需要使用二相的插頭進行充電,所以我們需要給這個插頭裝上一個二相的適配器:

如何理解和使用Java適配器模式?

三相插座介面:

/**
 * 三相插座接口
 */
public interface ThreePlugIf {

    //使用三相电流供电
    public void powerWithThree();

}

國標的二相插座:

/**
 * 国标的二相插座
 */
public class GBTowPlug {
    public void powerWithTwo(){
        System.out.println("使用二相电流供电");
    }
}

筆記本:

/**
 * 笔记本
 */
public class NoteBook {

    private ThreePlugIf plug;

    public NoteBook(ThreePlugIf plug){
        this.plug = plug;
    }

    //使用插座充电
    public void charge(){
        plug.powerWithThree();
    }
}

三相轉二相的插座轉接器:

/**
 * 三相转二相的插座适配器
 */

public class TwoPlugAdapter implements ThreePlugIf {


    private GBTowPlug plug;

    public TwoPlugAdapter(GBTowPlug plug) {
        this.plug = plug;
    }

    @Override
    public void powerWithThree() {
        System.out.println("通过转换");
        plug.powerWithTwo();
    }
}

測試類別:

public class Test {

    public static void main(String[] args) {

    GBTowPlug two = new GBTowPlug();
    ThreePlugIf three = new TwoPlugAdapter(two);
    NoteBook nb = new NoteBook(three);
    nb.charge();
	}
}

#輸出結果:

透過轉換

使用二相電流供電

#採用組合方式的適配器稱為物件適配器

#特點:

#將「被適配器」當作一個物件組合到適配器類別中,以修改目標介麵包裝給適配器

B、使用繼承的方式實作適配器:

如何理解和使用Java適配器模式?

#繼承適配器:

/**
 * 采用继承方式的插座适配器
 */
public class TwoPlugAdapterExtends extends GBTowPlug implements ThreePlugIf{
    @Override
    public void powerWithThree() {
        System.out.println("借助继承适配器");
        this.powerWithTwo();
    }
}

測試類別:

public class Test {

    public static void main(String[] args) {

    GBTowPlug two = new GBTowPlug();
    ThreePlugIf three = new TwoPlugAdapter(two);
    NoteBook nb = new NoteBook(three);
    nb.charge();

    //使用继承方法
    three = new TwoPlugAdapterExtends();
    nb = new NoteBook(three);
    nb.charge();
}
}

輸出:

透過轉換

使用二相電流供電

借助繼承適配器

使用二相電流供電

#採用繼承方式的稱為類別適配器

特點:

透過多重繼承不相容接口,實現對目標介面的匹配,單一的為某個類別而實現適配

#6、適配器模式的應用場景

  • 之前開發的系統存在滿足新系統功能需求的類,但其介面同新系統的介面不一致

  • 使用第三方提供的元件,但元件介面定義和自己要求的介面定義不同

  • #

以上是如何理解和使用Java適配器模式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除