国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java設(shè)計(jì)模式之(八)——適配器模式

番茄西紅柿 / 3124人閱讀

摘要:適配器模式應(yīng)用場景適配器模式應(yīng)用場景修改已使用的接口某個(gè)已經(jīng)投產(chǎn)中的接口需要修改,這時(shí)候使用適配器最好。適配器模式適配器模式是一種事后的補(bǔ)救策略。

1、什么是適配器模式?

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

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

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

2、適配器模式定義

image-20210910001149584

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

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

②、Adaptee源角色

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

③、Adapter適配器角色

適配器模式的核心角色, 其他兩個(gè)角色都是已經(jīng)存在的角色, 而適配器角色是需要新建立的, 它的職責(zé)非常簡單: 把源角色轉(zhuǎn)換為目標(biāo)角色, 怎么轉(zhuǎn)換? 通過繼承或是類關(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();    }}

基于組合的對象適配器

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();    }}

測試:

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é)果:

image-20210910084111245

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

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

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

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

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

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

②、增加了類的透明性

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

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

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

④、靈活性非常好

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

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

①、修改已使用的接口

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

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

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

③、兼容老版本接口

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

多帶帶一個(gè)項(xiàng)目做 Enumeration 到 Iterator 的替換,勉強(qiáng)還能接受。但是,使用 Java 開發(fā)的項(xiàng)目太多了,一次 JDK 的升級,導(dǎo)致所有的項(xiàng)目不做代碼修改就會編譯報(bào)錯(cuò),這顯然是不合理的。這就是我們經(jīng)常所說的不兼容升級。為了做到兼容使用低版本 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ū)別

①、代理模式在不改變原始類接口的條件下,為原始類定義一個(gè)代理類,主要目的是控制訪問,而非加強(qiáng)功能,這是它跟裝飾器模式最大的不同。

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

③、裝飾器模式:裝飾者模式在不改變原始類接口的情況下,對原始類功能進(jìn)行增強(qiáng),并且支持多個(gè)裝飾器的嵌套使用。

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

作者:IT可樂

資源:微信搜【IT可樂】關(guān)注我,回復(fù) 【電子書】有我特別篩選的免費(fèi)電子書。
本文版權(quán)歸作者所有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意不能轉(zhuǎn)載,否則保留追究法律責(zé)任的權(quán)利。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/125109.html

相關(guān)文章

  • Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師(全網(wǎng)最強(qiáng))

    摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...

    Scorpion 評論0 收藏0
  • JavaScript設(shè)計(jì)模式系列:外觀模式

    摘要:外觀模式外觀模式是指提供一個(gè)統(tǒng)一的接口去訪問多個(gè)子系統(tǒng)的多個(gè)不同的接口,為子系統(tǒng)中的一組接口提供統(tǒng)一的高層接口。外觀模式在我們的日常工作中十分常見。 外觀模式 外觀模式是指提供一個(gè)統(tǒng)一的接口去訪問多個(gè)子系統(tǒng)的多個(gè)不同的接口,為子系統(tǒng)中的一組接口提供統(tǒng)一的高層接口。使得子系統(tǒng)更容易使用,不僅簡化類中的接口,而且實(shí)現(xiàn)調(diào)用者和接口的解耦。外觀模式在我們的日常工作中十分常見。 我們來看一個(gè)例子...

    tianren124 評論0 收藏0
  • 開發(fā)路(設(shè)計(jì)模式:外觀模式

    摘要:改變接口的新模式,為了簡化接口這次帶來的模式為外觀模式,之所以這么稱呼,因?yàn)樗鼘⒁粋€(gè)或多個(gè)類復(fù)雜的一切都隱藏起來。 改變接口的新模式,為了簡化接口 這次帶來的模式為外觀模式,之所以這么稱呼,因?yàn)樗鼘⒁粋€(gè)或多個(gè)類復(fù)雜的一切都隱藏起來。 我依舊舉生活中例子,現(xiàn)在有些朋友家的液晶電視可能是大尺寸的,或者有用投影儀來看電視,打游戲的。有一天我想用家庭影院系統(tǒng)在家里看一次大片。 ...

    hosition 評論0 收藏0
  • 你和阿里資深架構(gòu)師間,差的不僅僅是年齡(進(jìn)階必看)

    摘要:導(dǎo)讀閱讀本文需要有足夠的時(shí)間,筆者會由淺到深帶你一步一步了解一個(gè)資深架構(gòu)師所要掌握的各類知識點(diǎn),你也可以按照文章中所列的知識體系對比自身,對自己進(jìn)行查漏補(bǔ)缺,覺得本文對你有幫助的話,可以點(diǎn)贊關(guān)注一下。目錄一基礎(chǔ)篇二進(jìn)階篇三高級篇四架構(gòu)篇五擴(kuò) 導(dǎo)讀:閱讀本文需要有足夠的時(shí)間,筆者會由淺到深帶你一步一步了解一個(gè)資深架構(gòu)師所要掌握的各類知識點(diǎn),你也可以按照文章中所列的知識體系對比自身,對自己...

    huaixiaoz 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<