成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

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

booster / 989人閱讀

摘要:定義和類(lèi)型定義將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)期望的另一個(gè)接口,適配器模式讓那些不兼容的類(lèi)可以一起工作。類(lèi)型結(jié)構(gòu)型類(lèi)適配器模式類(lèi)適配器模式使用繼承的方式去實(shí)現(xiàn)接口適配。它是適配器模式的核心。

0x01.定義和類(lèi)型

定義:將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)期望的另一個(gè)接口,適配器模式讓那些不兼容的類(lèi)可以一起工作。

類(lèi)型:結(jié)構(gòu)型

a.類(lèi)適配器模式

類(lèi)適配器模式:使用繼承的方式去實(shí)現(xiàn)接口適配。

UML:

Java實(shí)現(xiàn)

/**
 * 客戶(hù)需要的接口
 */
public interface Target {
    void request();
}

/**
 * 被適配的類(lèi)
 */
public class Adaptee {
    public void adapteeRequest () {
        System.out.println("被適配者的方法");
    }
}

/**
 * 適配器,繼承了被適配的類(lèi),并且實(shí)現(xiàn)了Target定義的接口
 */
public class Adapter extends Adaptee implements Target {
    @Override
    public void request() {
        //todo...
        System.out.println("適配后----");
        super.adapteeRequest();
        //todo...
    }
}

測(cè)試與應(yīng)用

/**
 * 測(cè)試類(lèi)
 */
public class Test {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        adaptee.adapteeRequest();

        Target adapterTarget = new Adapter();
        adapterTarget.request();
    }
}

輸出結(jié)果

被適配者的方法
適配后----
被適配者的方法
b.對(duì)象適配器模式

對(duì)象適配器模式:使用組合的方式去實(shí)現(xiàn)接口適配

UML

Java實(shí)現(xiàn)

/**
 * 客戶(hù)端應(yīng)用放使用的接口
 */
public interface Target {
    void request();
}

/**
 * 被適配的類(lèi)
 */
public class Adaptee {
    public void adapteeRequest () {
        System.out.println("被適配者的方法");
    }
}

/**
 * 適配器模式
 */
public class Adapter implements Target {

    /**
     * 組合了被適配的類(lèi),這里可以通過(guò)set方式注入
     */
    private Adaptee adaptee = new Adaptee();

    @Override
    public void request() {
        //todo...
        System.out.println("適配后----");
        adaptee.adapteeRequest();
        //todo...
    }
}

應(yīng)用與測(cè)試類(lèi)

/**
 * 應(yīng)用測(cè)試類(lèi)
 */
public class Test {

    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        adaptee.adapteeRequest();

        Target adapterTarget = new Adapter();
        adapterTarget.request();
    }
}

輸入結(jié)果

被適配者的方法
適配后----
被適配者的方法
c.角色介紹

從上面兩種情況可以看出,適配器模式一共有三個(gè)角色

Target(目標(biāo)抽象類(lèi)):目標(biāo)抽象類(lèi)定義客戶(hù)所需的接口,可以是一個(gè)抽象類(lèi)或接口,也可以是具體類(lèi)。

Adapter(適配器類(lèi)):它可以調(diào)用另一個(gè)接口,作為一個(gè)轉(zhuǎn)換器,對(duì)Adaptee和Target進(jìn)行適配。它是適配器模式的核心。

Adaptee(適配者類(lèi)):適配者即被適配的角色,它定義了一個(gè)已經(jīng)存在的接口,這個(gè)接口需要適配,適配者類(lèi)包好了客戶(hù)希望的業(yè)務(wù)方法。

0x02.適用場(chǎng)景

已經(jīng)存在的類(lèi),它的方法和需求不匹配時(shí)(方法結(jié)果相同或相似)

創(chuàng)建一個(gè)可以重復(fù)使用的類(lèi),用于和一些彼此之間沒(méi)有太大關(guān)聯(lián)的類(lèi),包括一些可能在將來(lái)引進(jìn)的類(lèi)一起工作

適配器模式不是軟件設(shè)計(jì)階段考慮的設(shè)計(jì)模式,是隨著軟件維護(hù),由于不同產(chǎn)品,不同廠(chǎng)家造成功能類(lèi)似而接口不相同情況下的解決方案。

0x03.優(yōu)點(diǎn)

能提高類(lèi)的透明性和復(fù)用,將具體的業(yè)務(wù)實(shí)現(xiàn)過(guò)程封裝在適配者類(lèi)中,對(duì)于客戶(hù)端類(lèi)而言是透明的,現(xiàn)有的類(lèi)復(fù)用但不需要改變,而且提高了適配者的復(fù)用性,同一適配者類(lèi)可以在多個(gè)不同的系統(tǒng)中復(fù)用。

目標(biāo)類(lèi)和適配器類(lèi)解耦,通過(guò)引入一個(gè)適配器類(lèi)來(lái)重用現(xiàn)有的適配者類(lèi),無(wú)需修改原有結(jié)構(gòu),提高程序擴(kuò)展性。

靈活性和擴(kuò)展性都非常好,通過(guò)使用配置文件,可以很方便的更換適配器,也可以在不修改原有代碼的基礎(chǔ)上,增加新的適配器,符合開(kāi)閉原則。

0x04.缺點(diǎn)

適配器編寫(xiě)過(guò)程需要全面考慮,可能會(huì)增加系統(tǒng)的復(fù)雜性。

一次最多只能適配一個(gè)適配者類(lèi),不能同時(shí)適配多個(gè)適配者。

增加系統(tǒng)代碼可讀的難度。

0x05. 樣例實(shí)現(xiàn)
筆記本的插頭為三項(xiàng)電,而現(xiàn)有的插座是兩項(xiàng)的,需要適配器來(lái)進(jìn)行適配,下面分別進(jìn)行兩種方式的實(shí)現(xiàn)。

通用代碼

/**
 * 三項(xiàng)插座接口
 * @author Administrator
 *
 */
public interface ThreePlugIf {
    //使用三項(xiàng)電流供電
    void powerWithThree();
}

/**
 * 二項(xiàng)電插座
 */
public class GBTowPlug {
    //使用二項(xiàng)電流供電
    public void powerWithTwo () {
        System.out.println("使用二項(xiàng)電流供電");
    }
}

/**
 * 筆記本類(lèi)
 */
public class NoteBook {

    private ThreePlugIf plug;

    /**
     * 只接收使用三項(xiàng)電充電
     * @param plug
     */
    public NoteBook (ThreePlugIf plug) {
        this.plug = plug;
    }

    /**
     * 使用插座充電
     */
    public void charge () {
        plug.powerWithThree();
    }
}
a.類(lèi)適配器的實(shí)現(xiàn)

具體Java代碼

/**
 * 采用繼承方式的插座適配器
 * @author Administrator
 */
public class TwoPlugAdapterExtends extends GBTowPlug implements ThreePlugIf {

    public void powerWithThree() {
        System.out.println("借助繼承適配器");
        this.powerWithTwo();
    }
}

測(cè)試與應(yīng)用類(lèi)

/**
 * 測(cè)試與應(yīng)用類(lèi)
 */
public class AdapterTest {

    public static void main(String[] args) {
        ThreePlugIf three = new TwoPlugAdapterExtends();
        NoteBook book = new NoteBook(three);
        book.charge();
    }
}

輸出結(jié)果

借助繼承適配器
使用二項(xiàng)電流供電

樣例UML類(lèi)圖:

b.對(duì)象適配器的實(shí)現(xiàn)

具體Java代碼

/**
 * 二項(xiàng)插座轉(zhuǎn)三項(xiàng)插座的適配器
 */
public class TwoPlugAdapter implements ThreePlugIf {

    /**
    * 組合
    */
    private GBTowPlug plug;

    public TwoPlugAdapter (GBTowPlug plug) {
        this.plug = plug;
    }

    public void powerWithThree() {
        System.out.println("通過(guò)轉(zhuǎn)化");
        plug.powerWithTwo();
    }
}

測(cè)試與應(yīng)用類(lèi)

/**
 * 測(cè)試與應(yīng)用類(lèi)
 */
public class AdapterTest {
    public static void main(String[] args) {
        GBTowPlug two = new GBTowPlug();
        ThreePlugIf three = new TwoPlugAdapter(two);
        NoteBook book = new NoteBook(three);
        book.charge();
    }
}

輸出結(jié)果

對(duì)象適配器-通過(guò)轉(zhuǎn)化
使用二項(xiàng)電流供電

樣例UML類(lèi)圖:

0x06.相關(guān)設(shè)計(jì)模式

適配器模式和外觀模式

對(duì)現(xiàn)有的類(lèi)現(xiàn)存系統(tǒng)的封裝

外觀:定義了新的接口,創(chuàng)建新的接口對(duì)現(xiàn)有接口的封裝

適配器:復(fù)用原有的接口,使兩個(gè)已有的接口協(xié)同工作

兩種:適配的力度不同,外觀針對(duì)的力度更大

0x07.源碼中的適配器

JDK: XmlAdapter

Spring AOP: AdvisorAdapter, MethodBeforeAdvice

Spring Data JPA: JpaVendorAdapter

Spring MVC: Handler Adacpter

0x08.源碼地址

適配器模式: https://github.com/sigmako/design-pattern/tree/master/adapter

0x09.參考

慕課網(wǎng)設(shè)計(jì)模式精講: https://coding.imooc.com/class/270.html

設(shè)計(jì)模式:適配器模式: https://www.cnblogs.com/songyaqi/p/4805820.html

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/75601.html

相關(guān)文章

  • 一天一個(gè)設(shè)計(jì)模式JS實(shí)現(xiàn)——配器模式

    摘要:本文參考于設(shè)計(jì)模式課程設(shè)計(jì)模式之適配器模式設(shè)計(jì)模式是一套被反復(fù)使用的多數(shù)人知曉的經(jīng)過(guò)分類(lèi)編目的代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。第一個(gè)設(shè)計(jì)模式是適配器模式。總的來(lái)說(shuō)適配器就是的模式,與修飾模式直接無(wú)感使用不同,適配器模式使用對(duì)象變?yōu)椤? 本文參考于:設(shè)計(jì)模式課程設(shè)計(jì)模式之適配器模式 設(shè)計(jì)模式是一套被反復(fù)使用的、多數(shù)人知曉的、經(jīng)過(guò)分類(lèi)編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了重用代碼、讓代碼更容易被...

    Aceyclee 評(píng)論0 收藏0
  • 轉(zhuǎn)換插座配器模式

    摘要:適配器模式之?dāng)?shù)據(jù)格式轉(zhuǎn)換適配器模式不僅可以起到適配接口名的作用,它另外還有一個(gè)功能就是能統(tǒng)一不同格式的作用。我們的目的就是在程序中,不要出現(xiàn)適配器模式,但考慮到實(shí)際,這也是不可能的,所以盡量將代碼設(shè)計(jì)符合規(guī)范是非常必要的。 這個(gè)模式應(yīng)該算是除了單例模式以外最簡(jiǎn)單的一個(gè)模式,沒(méi)有多余的類(lèi),這個(gè)模式只有一個(gè)職責(zé),就是轉(zhuǎn)換的你接口參數(shù),歸一化接口調(diào)用函數(shù),同意參數(shù)格式。 說(shuō)人話(huà)~其實(shí)就是,將...

    MudOnTire 評(píng)論0 收藏0
  • JavaScript設(shè)計(jì)模式配器模式

    摘要:舊接口格式和使用者不兼容,中間加一個(gè)適配器轉(zhuǎn)換接口。模式作用使用一個(gè)已經(jīng)存在的對(duì)象,但其方法或接口不符合你的要求。 原文博客地址:https://finget.github.io/2018/11/22/adapter/ 適配器模式 適配器模式(Adapter)是將一個(gè)類(lèi)(對(duì)象)的接口(方法或?qū)傩?轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口(方法或?qū)傩?,適配器模式使得原本由于接口不兼容而不能一起工作...

    CNZPH 評(píng)論0 收藏0
  • 設(shè)計(jì)模式配器模式

    摘要:適配器模式將一個(gè)類(lèi)的接口轉(zhuǎn)換為客戶(hù)期望的另一個(gè)接口。取桔子包裝準(zhǔn)備用途蘋(píng)果盒代替把蘋(píng)果盒適配成桔子包裝盒桔子包裝適配器適配器模式結(jié)構(gòu)圖用法繼承,同時(shí)組合對(duì)象引入成員變量使和產(chǎn)生關(guān)聯(lián)。 適配器模式:將一個(gè)類(lèi)的接口轉(zhuǎn)換為客戶(hù)期望的另一個(gè)接口。適配器讓原本接口不兼容的類(lèi)可以合作無(wú)間。 場(chǎng)景:水果店賣(mài)有橘子和蘋(píng)果,橘子用橘子包裝盒,蘋(píng)果用蘋(píng)果包裝盒,顧客A來(lái)買(mǎi)橘子,但是沒(méi)有橘子包裝盒了,則用蘋(píng)...

    Drummor 評(píng)論0 收藏0
  • PHP設(shè)計(jì)模式配器模式

    摘要:簡(jiǎn)介適配器模式有時(shí)候也稱(chēng)包裝樣式或者包裝將一個(gè)類(lèi)的接口適配成用戶(hù)所期待的。應(yīng)用場(chǎng)景如程序數(shù)據(jù)庫(kù)有關(guān)聯(lián)等操作,而你需要根據(jù)情況換數(shù)據(jù)庫(kù)操作時(shí),可以使用適配器模式統(tǒng)一接口,這樣代碼中除了數(shù)據(jù)庫(kù)配置之外,就不需要做而外的更改。 簡(jiǎn)介 適配器模式(有時(shí)候也稱(chēng)包裝樣式或者包裝)將一個(gè)類(lèi)的接口適配成用戶(hù)所期待的。一個(gè)適配允許通常因?yàn)榻涌诓患嫒荻荒茉谝黄鸸ぷ鞯念?lèi)工作在一起。 UML 角色 Tar...

    netScorpion 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<