0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是適配器模式

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-09 11:16 ? 次閱讀

1、什么是適配器模式?

Convert the interface of a class into another interface clients expect.Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.

適配器模式(Adapter Pattern):將一個(gè)類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無(wú)法在一起工作的兩個(gè)類能夠在一起工作。

說(shuō)人話:這個(gè)模式就是用來(lái)做適配的,它將不兼容的接口轉(zhuǎn)換為可兼容的接口,讓原本由于接口不兼容而不能一起工作的類可以一起工作。比如現(xiàn)實(shí)生活中的例子, USB 轉(zhuǎn)接頭就充當(dāng)適配器,把兩種不兼容的接口,通過(guò)轉(zhuǎn)接變得可以一起工作。

2、適配器模式定義

圖片

①、Target目標(biāo)角色

該角色定義把其他類轉(zhuǎn)換為何種接口, 也就是我們的期望接口, 例子中的IUserInfo接口就是目標(biāo)角色。

②、Adaptee源角色

你想把誰(shuí)轉(zhuǎn)換成目標(biāo)角色, 這個(gè)“誰(shuí)”就是源角色, 它是已經(jīng)存在的、 運(yùn)行良好的類或?qū)ο螅?經(jīng)過(guò)適配器角色的包裝, 它會(huì)成為一個(gè)嶄新、 靚麗的角色。

③、Adapter適配器角色

適配器模式的核心角色, 其他兩個(gè)角色都是已經(jīng)存在的角色, 而適配器角色是需要新建立的, 它的職責(zé)非常簡(jiǎn)單:把源角色轉(zhuǎn)換為目標(biāo)角色, 怎么轉(zhuǎn)換?通過(guò)繼承或是類關(guān)聯(lián)的方式。

3、適配器模式通用代碼實(shí)現(xiàn)

/**
 * 目標(biāo)角色
 */
public interface Target {
    void t1();
    void t2();
    void t3();
}
/**
 * 目標(biāo)角色實(shí)現(xiàn)類
 */
public class ConcreteTarget implements Target{

    @Override
    public void t1() {
        System.out.println("目標(biāo)角色 t1 方法");
    }

    @Override
    public void t2() {
        System.out.println("目標(biāo)角色 t2 方法");
    }

    @Override
    public void t3() {
        System.out.println("目標(biāo)角色 t3 方法");
    }
}
/**
 * 源角色:要把源角色轉(zhuǎn)換成目標(biāo)角色
 */
public class Adaptee {

    public void a1(){
        System.out.println("源角色 a1 方法");
    }

    public void a2(){
        System.out.println("源角色 a2 方法");
    }

    public void a3(){
        System.out.println("源角色 a3 方法");
    }
}

基于繼承的類適配器

/**
 * 適配器角色
 */
public class Adapter extends Adaptee implements Target{

    @Override
    public void t1() {
        super.a1();
    }

    @Override
    public void t2() {
        super.a2();
    }

    @Override
    public void t3() {
        super.a3();
    }
}

基于組合的對(duì)象適配器

public class AdapterCompose implements Target{

    private Adaptee adaptee;

    public AdapterCompose(Adaptee adaptee){
        this.adaptee = adaptee;
    }
    @Override
    public void t1() {
        adaptee.a1();
    }

    @Override
    public void t2() {
        adaptee.a2();
    }

    @Override
    public void t3() {
        adaptee.a3();
    }
}

測(cè)試:

public class AdapterClient {

    public static void main(String[] args) {
        // 原有的業(yè)務(wù)邏輯
        Target target = new ConcreteTarget();
        target.t1();

        // 基于繼承 增加適配器業(yè)務(wù)邏輯
        Target target1 = new Adapter();
        target1.t1();

        // 基于組合 增加適配器業(yè)務(wù)邏輯
        Target target2 = new AdapterCompose(new Adaptee());
        target2.t1();
    }
}

打印結(jié)果:

圖片

適配器模式有兩種實(shí)現(xiàn)方式:類適配器和對(duì)象適配器。其中,類適配器使用繼承關(guān)系來(lái)實(shí)現(xiàn),對(duì)象適配器使用組合關(guān)系來(lái)實(shí)現(xiàn)。在實(shí)際開(kāi)發(fā)中,選擇的依據(jù)如下:

①、如果 Adaptee 接口并不多,那兩種實(shí)現(xiàn)方式都可以。

②、如果 Adaptee 接口很多,而且 Adaptee 和 ITarget 接口定義大部分都相同,那我們推薦使用類適配器,因?yàn)?Adaptor 復(fù)用父類 Adaptee 的接口,比起對(duì)象適配器的實(shí)現(xiàn)方式,Adaptor 的代碼量要少一些。

③、如果 Adaptee 接口很多,而且 Adaptee 和 ITarget 接口定義大部分都不相同,那我們推薦使用對(duì)象適配器,因?yàn)榻M合結(jié)構(gòu)相對(duì)于繼承更加靈活。

4、適配器模式優(yōu)點(diǎn)

①、適配器模式可以讓兩個(gè)沒(méi)有任何關(guān)系的類在一起運(yùn)行, 只要適配器這個(gè)角色能夠搞定他們就成。

②、增加了類的透明性

我們?cè)L問(wèn)的Target目標(biāo)角色, 但是具體的實(shí)現(xiàn)都委托給了源角色, 而這些對(duì)高層次模塊是透明的, 也是它不需要關(guān)心的。

③、提高了類的復(fù)用度

源角色在原有的系統(tǒng)中還是可以正常使用, 而在目標(biāo)角色中也可以充當(dāng)新的演員。

④、靈活性非常好

適配器可以隨時(shí)去掉,而不會(huì)影響很多代碼。

5、適配器模式應(yīng)用場(chǎng)景

①、修改已使用的接口

某個(gè)已經(jīng)投產(chǎn)中的接口需要修改,這時(shí)候使用適配器最好。

②、統(tǒng)一多個(gè)類的接口設(shè)計(jì)

比如對(duì)于敏感詞過(guò)濾,需要調(diào)用好幾個(gè)第三方接口,每個(gè)接口方法名,方法參數(shù)又不一樣,這時(shí)候使用適配器模式,將所有第三方的接口適配為統(tǒng)一的接口定義。

③、兼容老版本接口

比如JDK1.0 中包含一個(gè)遍歷集合容器的類 Enumeration,JDK2.0 對(duì)這個(gè)類進(jìn)行了重構(gòu),將它改名為 Iterator 類,并且對(duì)它的代碼實(shí)現(xiàn)做了優(yōu)化。但是考慮到如果將 Enumeration 直接從 JDK2.0 中刪除,那使用 JDK1.0 的項(xiàng)目如果切換到 JDK2.0,代碼就會(huì)編譯不通過(guò)。為了避免這種情況的發(fā)生,我們必須把項(xiàng)目中所有使用到 Enumeration 的地方,都修改為使用 Iterator 才行。

單獨(dú)一個(gè)項(xiàng)目做 Enumeration 到 Iterator 的替換,勉強(qiáng)還能接受。但是,使用 Java 開(kāi)發(fā)的項(xiàng)目太多了,一次 JDK 的升級(jí),導(dǎo)致所有的項(xiàng)目不做代碼修改就會(huì)編譯報(bào)錯(cuò),這顯然是不合理的。這就是我們經(jīng)常所說(shuō)的不兼容升級(jí)。為了做到兼容使用低版本 JDK 的老代碼,我們可以暫時(shí)保留 Enumeration 類,并將其實(shí)現(xiàn)替換為直接調(diào)用 Itertor。

public class Collections {
  public static Emueration emumeration(final Collection c) {
    return new Enumeration() {
      Iterator i = c.iterator();
      
      public boolean hasMoreElments() {
        return i.hashNext();
      }
      
      public Object nextElement() {
        return i.next():
      }
    }
  }
}

④、適配不同格式的數(shù)據(jù)

6、代理-橋接-裝飾器-適配器區(qū)別

①、代理模式在不改變?cè)碱惤涌诘臈l件下,為原始類定義一個(gè)代理類,主要目的是控制訪問(wèn),而非加強(qiáng)功能,這是它跟裝飾器模式最大的不同。

②、橋接模式:橋接模式的目的是將接口部分和實(shí)現(xiàn)部分分離,從而讓它們可以較為容易、也相對(duì)獨(dú)立地加以改變。

③、裝飾器模式:裝飾者模式在不改變?cè)碱惤涌诘那闆r下,對(duì)原始類功能進(jìn)行增強(qiáng),并且支持多個(gè)裝飾器的嵌套使用。

④、適配器模式:適配器模式是一種事后的補(bǔ)救策略。適配器提供跟原始類不同的接口,而代理模式、裝飾器模式提供的都是跟原始類相同的接口。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8598

    瀏覽量

    151163
  • 適配器
    +關(guān)注

    關(guān)注

    8

    文章

    1952

    瀏覽量

    68029
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68616
  • ADAPTOR
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    5519
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    適配器模式和代理模式的區(qū)別

    對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用,這樣起到了中介的作用和保護(hù)了目標(biāo)對(duì)象的作用?! 。?)高擴(kuò)展性    適配器模式  在計(jì)算機(jī)編程中,適配器模式(有時(shí)候也稱包裝樣式或者包裝
    發(fā)表于 10-22 15:17

    適配器模式實(shí)現(xiàn)

    目錄第一章 適配器模式介紹第二章 適配器模式實(shí)現(xiàn)(類適配器)2.1、關(guān)系依賴圖2.2、創(chuàng)建交流電2.3、定義直流電2.4、創(chuàng)建充電器2.5、
    發(fā)表于 09-15 07:11

    適配器模式的作用

    適配器模式的作用是解決兩個(gè)軟件實(shí)體間的接口不兼容的問(wèn)題。使用適配器模式之后,原本由于接口不兼容而不能工作的兩個(gè)軟件實(shí)體可以一起工作。港式插頭轉(zhuǎn)換器
    發(fā)表于 11-11 06:30

    適配器模式相關(guān)資料推薦

    結(jié)構(gòu)型模式一、適配器模式(一)定義:適配器模式(Adapter Pattern)是作為兩個(gè)不兼容的接口之間的橋梁,它結(jié)合了兩個(gè)獨(dú)立接口的功能
    發(fā)表于 11-11 06:03

    缺省適配器模式基本概念

    在這一節(jié)我們就看一看第一類:缺省適配器模式一、缺省適配器模式基本概念1.1 說(shuō)明當(dāng)不需要全部實(shí)現(xiàn)接口提供的方法時(shí),可以設(shè)計(jì)一個(gè)適配器抽象類實(shí)
    發(fā)表于 11-11 07:53

    對(duì)象適配器模式基本概念

    在這一節(jié)我們就看一看第一類:對(duì)象適配器模式一、對(duì)象適配器模式基本概念1.1 說(shuō)明對(duì)象適配器模式
    發(fā)表于 11-11 07:09

    什么是硬件適配器模式

    硬件適配器模式提供一種方法,使已經(jīng)存在的硬件接口能適應(yīng)應(yīng)用期望。當(dāng)應(yīng)用需要使用一個(gè)接口而硬件提供另一種時(shí),硬件適配器模式創(chuàng)建元素在兩個(gè)接口之間進(jìn)行轉(zhuǎn)換。
    發(fā)表于 12-21 07:55

    適配器模式的本質(zhì)及分類

    什么是適配器 在計(jì)算機(jī)編程中,適配器模式(有時(shí)候也稱包裝樣式或者包裝)把一個(gè)類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無(wú)法在一起工作的兩個(gè)類能夠在一起工作。一個(gè)適配
    發(fā)表于 10-18 15:06 ?3154次閱讀

    適配器模式和代理模式的區(qū)別

    適配器模式適配器模式有時(shí)候也稱包裝樣式或者包裝。將一個(gè)類的接口轉(zhuǎn)接成用戶所期待的。代理模式:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。
    發(fā)表于 01-12 11:56 ?5275次閱讀
    <b class='flag-5'>適配器</b><b class='flag-5'>模式</b>和代理<b class='flag-5'>模式</b>的區(qū)別

    適配器模式的應(yīng)用

    在計(jì)算機(jī)編程中,適配器模式(有時(shí)候也稱包裝樣式或者包裝)將一個(gè)類的接口適配成用戶所期待的。一個(gè)適配允許通常因?yàn)榻涌诓患嫒荻荒茉谝黄鸸ぷ鞯念惞ぷ髟谝黄?,做法是將類自己的接口包裹在一個(gè)已
    發(fā)表于 01-12 14:28 ?1010次閱讀
    <b class='flag-5'>適配器</b><b class='flag-5'>模式</b>的應(yīng)用

    JavaScript設(shè)計(jì)模式適配器模式

    適配器模式的作用是解決兩個(gè)軟件實(shí)體間的接口不兼容的問(wèn)題。使用適配器模式之后,原本由于接口不兼容而不能工作的兩個(gè)軟件實(shí)體可以一起工作。港式插頭轉(zhuǎn)換器
    發(fā)表于 11-06 16:21 ?5次下載
    JavaScript設(shè)計(jì)<b class='flag-5'>模式</b>之<b class='flag-5'>適配器</b><b class='flag-5'>模式</b>

    設(shè)計(jì)模式-適配器模式-以電壓適配器為例

    超級(jí)鏈接: Java常用設(shè)計(jì)模式的實(shí)例學(xué)習(xí)系列-緒論參考:《HeadFirst設(shè)計(jì)模式》1.關(guān)于適配器模式適配器
    發(fā)表于 11-07 09:36 ?17次下載
    設(shè)計(jì)<b class='flag-5'>模式</b>-<b class='flag-5'>適配器</b><b class='flag-5'>模式</b>-以電壓<b class='flag-5'>適配器</b>為例

    適配器模式設(shè)計(jì)

    適配器模式一般是在我們要把”現(xiàn)有的對(duì)象“應(yīng)用到新的環(huán)境中時(shí)使用,通過(guò)編寫一個(gè)Adapter類,把原有的類應(yīng)用到新的類中,而不必修改原有類,也不必重寫已有類。
    的頭像 發(fā)表于 06-01 14:22 ?692次閱讀
    <b class='flag-5'>適配器</b><b class='flag-5'>模式</b>設(shè)計(jì)

    什么是適配器模式?怎樣使用適配器模式進(jìn)行貨幣轉(zhuǎn)換?

    在軟件開(kāi)發(fā)中,通常使用具有不兼容接口的現(xiàn)有代碼或外部庫(kù)。 適配器模式提供了一個(gè)優(yōu)雅的解決方案,充當(dāng)不兼容接口之間的橋梁,無(wú)需修改現(xiàn)有代碼即可實(shí)現(xiàn)無(wú)縫集成。
    的頭像 發(fā)表于 07-19 14:35 ?599次閱讀

    設(shè)計(jì)模式中什么是適配器模式?

    適配器模式(Adapter),將一個(gè)類的接口適配成用戶所期待的。
    的頭像 發(fā)表于 08-02 10:00 ?838次閱讀
    設(shè)計(jì)<b class='flag-5'>模式</b>中什么是<b class='flag-5'>適配器</b><b class='flag-5'>模式</b>?