最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java適配器模式如何讓不兼容的接口變得兼容

 更新時間:2023年09月20日 10:16:15   作者:wayn  
這篇文章主要為大家介紹了java適配器模式如何讓不兼容的接口變得兼容示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

在軟件開發(fā)中,我們經常會遇到這樣的情況:我們需要使用一個現有的類或者接口,但它與我們系統(tǒng)的目標接口不兼容,而我們又不能修改它。這時候,我們該怎么辦呢?大多數情況下我們都可以使用適配器模式來解決這個問題,本文將從以下方面講解適配器模式。

簡介

適配器模式(Adapter Pattern)是一種結構型設計模式,它可以將一個接口轉換成客戶端所期待的另一個接口,從而使原本由于接口不兼容而不能一起工作的類可以一起工作。適配器模式也稱為包裝器模式(Wrapper Pattern),因為它通過一個包裝類(即適配器)來包裝不兼容的接口,并提供統(tǒng)一的目標接口。適配器模式可以在運行時根據需要選擇不同的適配器來適配不同的被適配者。

對象適配器模式的各角色定義如下。

  • Target(目標接口):客戶端要使用的目標接口標準,對應下文中的三相插孔接口 TriplePin。
  • Adapter(適配器):實現了目標接口,負責適配(轉換)被適配者的接口 specificRequest()為目標接口 request(),對應本章下文中的電視機專屬適配器類 TriplePinAdapter。
  • Adaptee(被適配者):被適配者的接口標準,目前不能兼容目標接口的問題接口,可以有多種實現類,對應下文中的兩相插孔接口 DualPin。
  • Client(客戶端):目標接口的使用者。

 推薦博主開源的 H5 商城項目waynboot-mall,這是一套全部開源的微商城項目,包含三個項目:運營后臺、H5 商城前臺和服務端接口。實現了商城所需的首頁展示、商品分類、商品詳情、商品 sku、分詞搜索、購物車、結算下單、支付寶/微信支付、收單評論以及完善的后臺管理等一系列功能。 技術上基于最新得 Springboot3.0、jdk17,整合了 MySql、Redis、RabbitMQ、ElasticSearch 等常用中間件。分模塊設計、簡潔易維護,歡迎大家點個 star、關注博主。

github 地址:https://github.com/wayn111/waynboot-mall

優(yōu)缺點

適配器模式的優(yōu)點有:

  • 適配器模式可以增強程序的可擴展性,通過使用適配器,可以在不修改原有代碼的基礎上引入新的功能或者接口。
  • 適配器模式可以提高類的復用性,通過使用適配器,可以將已有的類或者接口重新組合和封裝,使其符合新的需求。
  • 適配器模式可以增加類的透明度,通過使用適配器,客戶端只需要關注目標接口,而無需了解被適配者的具體實現。
  • 適配器模式可以靈活地切換不同的被適配者,通過使用不同的適配器,可以動態(tài)地選擇不同的被適配者來滿足不同的場景。

適配器模式的缺點有:

  • 適配器模式會增加系統(tǒng)的復雜性,過多地使用適配器會使系統(tǒng)變得零亂和難以理解。
  • 適配器模式可能會降低系統(tǒng)的性能,因為每次調用目標接口時都需要經過適配器的轉換。
  • 適配器模式可能會違反開閉原則,如果目標接口發(fā)生變化,則需要修改所有的適配器類。

應用場景

適配器模式適用于以下場景:

  • 當需要在一個已有系統(tǒng)中引入新的功能或者接口時,它與系統(tǒng)的目標接口不兼容,但又不能修改原有代碼時,可以使用適配器模式。例如在一個數據庫操作系統(tǒng)中,如果想要支持多種類型的數據庫源,但系統(tǒng)只提供了一個固定類型數據庫源的操作接口時,可以使用一個數據庫源操作適配器來將不同類型數據庫源轉換成統(tǒng)一類型數據庫源。
  • 當需要在多個獨立開發(fā)的系統(tǒng)或者組件之間進行協(xié)作時,但由于各自采用了不同的接口或者協(xié)議時,可以使用適配器模式。例如在一個分布式服務系統(tǒng)中,如果想要讓不同語言編寫的服務之間進行通信和調用,但各自采用了不同的通信協(xié)議和數據格式時,可以使用一個服務通信適配器來將不同協(xié)議和數據格式轉換成統(tǒng)一協(xié)議和數據格式。

Java 代碼示例

舉一個生活中常見的實例,我們新買了一臺電視機,其電源插頭是兩相的,不巧的是墻上的插孔卻是三相的,這時電視機便無法通電使用,我們以代碼來重現這個場景。

  • 定義目標接口:三相插口 TriplePin,其中 3 個參數 l、n、e 分別對應火線(live)、零線(null)和地線(earth)。
public interface TriplePin {
    public void electrify(int l, int n, int e);
}
  • 定義被適配者接口:兩項插口 DualPin,可以看到參數中缺少了地線 e 參數。
public interface DualPin {
    public void electrify(int l, int n);
}
  • 添加被適配者接口具體實現類:TV,可以看到 TV 實現的是兩相接口,所在無法直接在三項接口中使用。
public class TV implements DualPin {
    @Override
    public void electrify(int l, int n) {
        System.out.println("火線通電:" + l + ",零線通電:" + n);
        System.out.println("電視開機");
    }
}
  • 定義適配器類:三項接口適配器 TriplePinAdapter,實現了三項接口并且包含兩項接口屬性,在 electrify 方法中調用被適配設備的兩插通電方法,忽略地線參數 e,以此來完成三項接口對兩項接口的兼容。

這也就意味著 TriplePinAdapter 類能幫助我們將 TV 類與三項接口兼容。

public class TriplePinAdapter implements TriplePin {
    private DualPin dualPin;
    public TriplePinAdapter(DualPin dualPin) {
        this.dualPin = dualPin;
    }
    @Override
    public void electrify(int l, int n, int e) {
        // 調用被適配設備的兩插通電方法,忽略地線參數e
        dualPin.electrify(l, n);
    }
}
  • 定義客戶端類
public class Client {
    public static void main(String[] args) {
        DualPin dualPinDevice = new TV();
        TriplePin triplePinDevice = new TriplePinAdapter(dualPinDevice);
        triplePinDevice.electrify(1, 0, -1);
    }
}

輸出結果如下:

火線通電:1,零線通電:0
電視開機

總結

通過利用適配器模式對系統(tǒng)進行擴展后,我們就不必再為解決兼容性問題去暴力修改類接口了,轉而通過適配器,以更為優(yōu)雅、巧妙的方式將兩側“對立”的接口“整合”在一起,順利化解雙方難以調和的矛盾,最終使它們順利接通。

以上就是java適配器模式如何讓不兼容的接口變得兼容的詳細內容,更多關于java適配器模式接口兼容的資料請關注腳本之家其它相關文章!

相關文章

  • Spring Security中successHandler和failureHandler使用方式

    Spring Security中successHandler和failureHandler使用方式

    這篇文章主要介紹了Spring Security中successHandler和failureHandler使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java中ArrayList單行初始化的多種方法

    Java中ArrayList單行初始化的多種方法

    在Java開發(fā)中,我們經常需要初始化列表,尤其是ArrayList,用于存儲和管理數據,為了提高代碼的簡潔性和可讀性,我們希望能在一行代碼內完成ArrayList的初始化,本文將介紹多種在Java中單行初始化ArrayList的方法,需要的朋友可以參考下
    2025-07-07
  • Java泛型的概念、定義與運行方法分析

    Java泛型的概念、定義與運行方法分析

    這篇文章主要介紹了Java泛型的概念、定義與運行方法,結合實例形式分析了java泛型的基本概念、定義與IDEA、命令行兩種運行方法,需要的朋友可以參考下
    2019-08-08
  • 關于阿里巴巴TransmittableThreadLocal使用解讀

    關于阿里巴巴TransmittableThreadLocal使用解讀

    文章主要介紹了三種ThreadLocal的使用:ThreadLocal、InheritableThreadLocal和TransmittableThreadLocal,ThreadLocal和InheritableThreadLocal在單線程和部分情況下可以正常工作,但TransmittableThreadLocal在處理線程池時表現更佳
    2025-02-02
  • maven無法依賴spring-cloud-stater-zipkin的解決方案

    maven無法依賴spring-cloud-stater-zipkin的解決方案

    這篇文章主要介紹了maven無法依賴spring-cloud-stater-zipkin如何解決,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • 詳解JVM基礎之字節(jié)碼的增強技術

    詳解JVM基礎之字節(jié)碼的增強技術

    字節(jié)碼增強技術就是一類對現有字節(jié)碼進行修改或者動態(tài)生成全新字節(jié)碼文件的技術。接下來,我們將從最直接操縱字節(jié)碼的實現方式開始深入進行剖析,感興趣的可以了解一下
    2022-10-10
  • Java string.trim()究竟去掉了什么

    Java string.trim()究竟去掉了什么

    這篇文章主要介紹了Java string.trim()究竟去掉了什么,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • 詳解如何在React中逃離閉包陷阱

    詳解如何在React中逃離閉包陷阱

    眾所周知,JavaScript 中的閉包(Closures)一定是這種語言最可怕的特性之一,另外它可能也是最隱蔽的語言特性之一,我們在編寫 React 代碼時經常會用到它,但是大多數時候我們甚至沒有意識到這一點,本文小編將和大家一起深入探討如何在React中逃離閉包陷阱
    2023-09-09
  • Java集合框架之Map詳解

    Java集合框架之Map詳解

    這篇文章主要為大家詳細介紹了Java集合框架之Map,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Java圖片處理之獲取gif圖一幀圖片的兩種方法

    Java圖片處理之獲取gif圖一幀圖片的兩種方法

    這篇文章主要給大家介紹了關于Java圖片處理之獲取gif圖一幀圖片的兩種方法,分別是利用Java原生代碼和使用im4java調用ImageMagick來實現,兩種方法都給出來示例代碼供大家參考學習,需要的朋友們下面來一起看看吧。
    2017-10-10

最新評論

临猗县| 澄江县| 新民市| 长寿区| 白水县| 冷水江市| 思南县| 宿州市| 高淳县| 桦甸市| 舒兰市| 基隆市| 涿州市| 通榆县| 浮山县| 武城县| 郸城县| 双牌县| 凤台县| 芦溪县| 商水县| 孝感市| 新乡市| 政和县| 泰来县| 龙井市| 永登县| 新闻| 渭南市| 通城县| 安岳县| 哈尔滨市| 贵南县| 长宁县| 行唐县| 大关县| 东阳市| 桓仁| 岑溪市| 汝阳县| 岢岚县|