欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

引言

在軟件開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到這樣的情況:我們需要使用一個(gè)現(xiàn)有的類或者接口,但它與我們系統(tǒng)的目標(biāo)接口不兼容,而我們又不能修改它。這時(shí)候,我們?cè)撛趺崔k呢?大多數(shù)情況下我們都可以使用適配器模式來(lái)解決這個(gè)問(wèn)題,本文將從以下方面講解適配器模式。

簡(jiǎn)介

適配器模式(Adapter Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式,它可以將一個(gè)接口轉(zhuǎn)換成客戶端所期待的另一個(gè)接口,從而使原本由于接口不兼容而不能一起工作的類可以一起工作。適配器模式也稱為包裝器模式(Wrapper Pattern),因?yàn)樗ㄟ^(guò)一個(gè)包裝類(即適配器)來(lái)包裝不兼容的接口,并提供統(tǒng)一的目標(biāo)接口。適配器模式可以在運(yùn)行時(shí)根據(jù)需要選擇不同的適配器來(lái)適配不同的被適配者。

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

  • Target(目標(biāo)接口):客戶端要使用的目標(biāo)接口標(biāo)準(zhǔn),對(duì)應(yīng)下文中的三相插孔接口 TriplePin。
  • Adapter(適配器):實(shí)現(xiàn)了目標(biāo)接口,負(fù)責(zé)適配(轉(zhuǎn)換)被適配者的接口 specificRequest()為目標(biāo)接口 request(),對(duì)應(yīng)本章下文中的電視機(jī)專屬適配器類 TriplePinAdapter。
  • Adaptee(被適配者):被適配者的接口標(biāo)準(zhǔn),目前不能兼容目標(biāo)接口的問(wèn)題接口,可以有多種實(shí)現(xiàn)類,對(duì)應(yīng)下文中的兩相插孔接口 DualPin。
  • Client(客戶端):目標(biāo)接口的使用者。

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

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

優(yōu)缺點(diǎn)

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

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

適配器模式的缺點(diǎn)有:

  • 適配器模式會(huì)增加系統(tǒng)的復(fù)雜性,過(guò)多地使用適配器會(huì)使系統(tǒng)變得零亂和難以理解。
  • 適配器模式可能會(huì)降低系統(tǒng)的性能,因?yàn)槊看握{(diào)用目標(biāo)接口時(shí)都需要經(jīng)過(guò)適配器的轉(zhuǎn)換。
  • 適配器模式可能會(huì)違反開(kāi)閉原則,如果目標(biāo)接口發(fā)生變化,則需要修改所有的適配器類。

應(yīng)用場(chǎng)景

適配器模式適用于以下場(chǎng)景:

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

Java 代碼示例

舉一個(gè)生活中常見(jiàn)的實(shí)例,我們新買了一臺(tái)電視機(jī),其電源插頭是兩相的,不巧的是墻上的插孔卻是三相的,這時(shí)電視機(jī)便無(wú)法通電使用,我們以代碼來(lái)重現(xiàn)這個(gè)場(chǎng)景。

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

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

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) {
        // 調(diào)用被適配設(shè)備的兩插通電方法,忽略地線參數(shù)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);
    }
}

輸出結(jié)果如下:

火線通電:1,零線通電:0
電視開(kāi)機(jī)

總結(jié)

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

以上就是java適配器模式如何讓不兼容的接口變得兼容的詳細(xì)內(nèi)容,更多關(guān)于java適配器模式接口兼容的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Maven分步詳解多環(huán)境配置與應(yīng)用流程

    Maven分步詳解多環(huán)境配置與應(yīng)用流程

    這篇文章主要介紹了Maven進(jìn)階多環(huán)境配置與應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • java基于Socket做一個(gè)簡(jiǎn)單下載器

    java基于Socket做一個(gè)簡(jiǎn)單下載器

    這篇文章主要為大家詳細(xì)介紹了java如何基于Socket制作一個(gè)簡(jiǎn)單下載器,感興趣的小伙伴們可以參考一下
    2016-08-08
  • IDEA搭建Maven模塊化項(xiàng)目的實(shí)現(xiàn)

    IDEA搭建Maven模塊化項(xiàng)目的實(shí)現(xiàn)

    本文主要介紹了IDEA搭建Maven模塊化項(xiàng)目的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • java常用的加密解決方案分享

    java常用的加密解決方案分享

    這篇文章全面介紹了Java中加解密技術(shù)的應(yīng)用,包括哈希函數(shù)、對(duì)稱加密、非對(duì)稱加密、消息認(rèn)證碼和數(shù)字簽名等,它詳細(xì)解釋了每種技術(shù)的工作原理,并提供了相應(yīng)的Java代碼示例,文章還強(qiáng)調(diào)了密鑰管理的重要性,并提出了在實(shí)際應(yīng)用中遵循的最佳實(shí)踐
    2025-01-01
  • 基于Spring Mvc實(shí)現(xiàn)的Excel文件上傳下載示例

    基于Spring Mvc實(shí)現(xiàn)的Excel文件上傳下載示例

    本篇文章主要介紹了基于Spring Mvc實(shí)現(xiàn)的Excel文件上傳下載示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • Java中線程的基本方法使用技巧

    Java中線程的基本方法使用技巧

    這篇文章主要介紹了Java中線程的基本方法使用技巧,需要的朋友可以參考下
    2017-09-09
  • Spring中Cache的使用方法詳解

    Spring中Cache的使用方法詳解

    這篇文章主要介紹了Spring中Cache的使用方法詳解,Spring Cache 是一個(gè)框架,實(shí)現(xiàn)了基于注解的緩存功能,只需要簡(jiǎn)單地加一個(gè)注解,就能實(shí)現(xiàn)緩存功能,Spring Cache 提供了一層抽象,底層可以切換不同的緩存實(shí)現(xiàn),需要的朋友可以參考下
    2024-01-01
  • SpringSecurity Oauth2訪問(wèn)令牌續(xù)期問(wèn)題

    SpringSecurity Oauth2訪問(wèn)令牌續(xù)期問(wèn)題

    這篇文章主要介紹了SpringSecurity Oauth2訪問(wèn)令牌續(xù)期問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Java for-each循環(huán)使用難題2例(高級(jí)使用方法)

    Java for-each循環(huán)使用難題2例(高級(jí)使用方法)

    從Java5起,在Java中有了for-each循環(huán),可以用來(lái)循環(huán)遍歷collection和array。For each循環(huán)允許你在無(wú)需保持傳統(tǒng)for循環(huán)中的索引,或在使用iterator /ListIterator時(shí)無(wú)需調(diào)用while循環(huán)中的hasNext()方法就能遍歷collection
    2014-04-04
  • springboot結(jié)合maven配置不同環(huán)境的profile方式

    springboot結(jié)合maven配置不同環(huán)境的profile方式

    這篇文章主要介紹了springboot結(jié)合maven配置不同環(huán)境的profile方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評(píng)論