Java實現23種設計模式(四):適配器模式(重點掌握)

二十三種設計模式分類

設計模式三大分類.jpg


一、概述

適配器模式(Adapter Pattern)是作爲兩個不兼容的接口之間的橋樑。這種類型的設計模式屬於結構型模式,它結合了兩個獨立接口的功能。

這種模式涉及到一個單一的類,該類負責加入獨立的或不兼容的接口功能。舉個真實的例子,讀卡器是作爲內存卡和筆記本之間的適配器。您將內存卡插入讀卡器,再將讀卡器插入筆記本,這樣就可以通過筆記本來讀取內存卡。

優點

  • 客戶端通過適配器可以透明地調用目標接口。
  • 複用了現存的類,程序員不需要修改原有代碼而重用現有的適配者類。
  • 將目標類和適配者類解耦,解決了目標類和適配者類接口不一致的問題。

缺點

  • 過多地使用適配器,會讓系統非常零亂,不易整體進行把握。比如,明明看到調用的是 A 接口,其實內部被適配成了B接口的實現,一個系統如果太多出現這種情況,無異於一場災難。因此如果不是很有必要,可以不使用適配器,而是直接對系統進行重構。
  • 由於JAVA至多繼承一個類,所以至多隻能適配一個適配者類,而且目標類必須是抽象類。

場景

有動機地修改一個正常運行的系統的接口,這時應該考慮使用適配器模式。


二、實現

1. 結構圖

適配器模式(Adapter)包含以下主要角色:

  • 目標(Target)接口:當前系統業務所期待的接口,它可以是抽象類或接口。
  • 適配者(Adaptee)類:它是被訪問和適配的現存組件庫中的組件接口。
  • 適配器(Adapter)類:它是一個轉換器,通過繼承或引用適配者的對象,把適配者接口轉換成目標接口,讓客戶按目標接口的格式訪問適配者。

類適配器模式

PS: 類適配器模式耦合度比較高,要求瞭解組件庫中相關組件的內部結構,相對於對象適配器模式用得相對較少;

對象適配器模式

PS:UML結構圖可以參考,例子實現並不根據UML圖來完成,靈活實現即可;

2. 實現

package cn.missbe.model.adpater;

/**
 * Copyright (c) 2020.
 * Email: [email protected]
 *
 * @author lyg  2020/4/29 下午4:28
 * description:
 * 電壓適配器:英國電壓爲240V,中國電壓爲220V
 **/

public class VoltageAdapter {
    public static UKCharger chinaCharger2UKCharger(ChinaCharger chinaCharger) {
        UKCharger ukCharger = new UKCharger();
        ukCharger.voltage = chinaCharger.voltage;
        ukCharger.frequency = chinaCharger.voltage;
        return ukCharger;
    }

    public static ChinaCharger uKCharger2ChinaCharger(UKCharger ukCharger) {
        ChinaCharger chinaCharger = new ChinaCharger();
        chinaCharger.voltage = ukCharger.voltage;
        chinaCharger.frequency = ukCharger.frequency;
        return chinaCharger;
    }
    public static void main(String[] args) {
        /*
         * 實現英國的充電器在中國能夠使用,需要轉換電壓和頻率
         */
        UKCharger ukCharger = new UKCharger();
        ChinaCharger chinaCharger = VoltageAdapter.uKCharger2ChinaCharger(ukCharger);
        chinaCharger.charger();

        /*
         * 實現中國的充電器在英國能夠使用,需要轉換電壓和頻率
         */
        ukCharger = VoltageAdapter.chinaCharger2UKCharger(chinaCharger);
        ukCharger.charger();
    }
}

/**
 * 英國的充電器標準
 */
class UKCharger {
    String voltage = "240v";
    String frequency = "50HZ";

    public void charger() {
        System.out.println("UKCharger is Charging.");
    }
}

/**
 * 中國的充電器標準
 */
class ChinaCharger {
    String voltage = "220v";
    String frequency = "50HZ";

    public void charger() {
        System.out.println("ChinaCharger is Charging.");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章