適配器模式的理解和示例


一、是什么

1. 定義:讓原來不兼容的兩個接口協同工作

2. 分類: 類適配器、對象適配器、接口適配器

3. 角色

  • 目標接口:Target,該角色把其他類轉換為我們期望的接口
  • 被適配者: Adaptee 原有的接口,也是希望被改變的接口
  • 適配器: Adapter, 將被適配者和目標接口組合到一起的類

4. 類圖

對象適配器,使用組合

類適配器,在java中實現不了,需要多重繼承才能實現,類圖是這個樣子的,當然如果變通一下,Target是接口就可以了

接口適配器 抽象方法

接口適配器的使用場景: 原有接口有很多方法,而我們只需要其中一部分,這是看可以用抽象類來實現該接口,不需要的方法只需要寫個空方法(默認實現)就好了,接口目標類去實現自己需要的接口

適用的場景是不想實現原有類的所有方法

二、示例

  • 背景:買了一個進口筆記本電腦
  • 沖突:筆記本電腦需要的三項電源,和只提供的二項電源沖突
  • 解決方案:設置一個適配器二項充電口轉化為三項充電口

2.1.1 Adaptee 原有的類 提供二項電

/**
 * 插頭 二項供電 Adaptee
 */
public class TwoPower {

    public void powerByTwo() {
        System.out.println("提供二項供電");
    }
}

 2.1.2 Target 目標類  能輸出三項供電

/**
 * 插頭提供三項供電 (target)
 */
public interface ThreePower {

    /**
     * 三項供電
     */
    void powerByThree();
}

2.1.3 對象適配器,轉換類 Adapter

/**
 * 二項轉三項的適配器  組合的方式  對象適配器
 */
public class TwoToThreeAdapter implements ThreePower{

    /**
     * 使用委托來完成適配 */
    private TwoPower twoPower;

    public TwoToThreeAdapter(TwoPower twoPower) {
        this.twoPower = twoPower;
    }


    @Override
    public void powerByThree() {
        System.out.println("借助組合適配器轉化二項電");
        twoPower.powerByTwo();
    }
}

2.1.4 類適配器 轉換類 Adapter

/**
 *  二項轉三項的適配器  繼承的方式  類
 */
public class TwoToThreeAdapter2 extends TwoPower implements ThreePower {


    @Override
    public void powerByThree() {
        System.out.println("借助繼承適配器轉化二項電");
        this.powerByTwo();
    }
}

測試

/**
 * 筆記本電腦 這是使用組合模式的-適配器模式
 */
public class NoteBook {

    /**
     * 期望的三項供電接口
     */
    private ThreePower threePower;

    public NoteBook(ThreePower threePower) {
        this.threePower = threePower;
    }


    public static void main(String[] args) {
        // ============================ 繼承方式的適配器使用 類適配器 =====================================
        ThreePower threePower1 = new TwoToThreeAdapter2();
        NoteBook noteBook1 = new NoteBook(threePower1);
        noteBook1.recharge();
        noteBook1.work();

        // ============================ 組合方式的適配器使用 對象適配器 =====================================
        // 現在只有二項供電
        TwoPower twoPower = new TwoPower();
        ThreePower threePower = new TwoToThreeAdapter(twoPower);
        NoteBook noteBook = new NoteBook(threePower);
        // 1. 充電
        noteBook.recharge();
        // 2. 工作
        noteBook.work();
    }

    public void work() {
        System.out.println("筆記本電腦開始工作!");
    }

    public void recharge() {
        // 使用三項充電
        threePower.powerByThree();
    }
}

控制台顯示:

  提供二項供電
  借助繼承適配器轉化二項電
  筆記本電腦開始工作!

  提供二項供電
  借助組合適配器轉化二項電
  筆記本電腦開始工作!

三、總結

適配器好處

  • 重用
    • 復用的現存的類, 解決了現存類和復用環境要不一致的問題
  • 低耦合
    • 無需修改原有代碼(遵循開閉原則)

這里說些缺點吧,過多的使用適配器,的確會讓程序看起來很難懂,我的理解是,在適配別人接口和其他API接口時,適配器的用處就來了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM