小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 印度阿三17 2018-12-14

本文簡述適配器模式,考慮到j(luò)ava中沒有多繼承就只寫了對(duì)象適配器模式,然后例子是怎么用轉(zhuǎn)接口把3.5mm耳機(jī)插在小米8上面。

image-20181214211029904

一、概念

適配器模式(英語:adapter pattern)有時(shí)候也稱包裝樣式或者包裝(wrapper)。將一個(gè)類的接口轉(zhuǎn)接成用戶所期待的。一個(gè)適配器使得因接口不兼容而不能在一起工作的類能在一起工作,做法是將類自己的接口包裹在一個(gè)已存在的類中。

適配器模式允許一個(gè)已存在的類的接口被用作另一個(gè)接口。通常可以在不需要修改源代碼的情況下使用已存在的類。

其實(shí)在生活中,適配器隨處看見,例如下圖,一個(gè)type-c轉(zhuǎn)耳機(jī)口的適配器。接下來讓我看看適配器模式的結(jié)構(gòu),并用java代碼來實(shí)現(xiàn)一個(gè)type-c接口的手機(jī)與3.5mm的耳機(jī)通過適配器連接。

image-20181214184815532

適配器模式主要解決兩個(gè)問題
1.轉(zhuǎn)換當(dāng)前接口為客戶端需要的接口
2.通過適配器使用沒有我們需要的接口的類

描述看似相同,實(shí)際上出發(fā)點(diǎn)不同~嘿嘿,意會(huì)意會(huì)

二、結(jié)構(gòu)

適配器模式有兩種,一種是類適配器,不過需要支持多繼承的語言才能實(shí)現(xiàn),本文主要講解單繼承也可以實(shí)現(xiàn)的對(duì)象適配器。下圖是對(duì)象適配器模式的類圖,Client需要一個(gè)實(shí)現(xiàn)Target接口的類來完成工作,而當(dāng)前我們提供的只有Adaptee類,這時(shí)該怎么辦呢?恩,我們就造一個(gè)適配器(adapter)來完成這個(gè)需求。

image-20181214075257986

涉及到的主要角色:

? Target:目標(biāo)接口,也就是我們期待得到的接口。

? Adaptee:當(dāng)前擁有的接口,需要適配,已滿足客戶端的要求。

? Adapter:適配器類,適配器模式的核心,就是將Adaptee轉(zhuǎn)換成需要的接口的具體類。

三、Type-C轉(zhuǎn)3.5mm耳機(jī)孔適配器

這個(gè)是小米8手機(jī)類,只提供插TypeC耳機(jī)的接口

public class Mi8{
    private TypeCEraPhones eraPhones;
    //打電話功能
    public void call() {
        System.out.println("打電話");
    }
    //播放音樂,有耳機(jī)就用耳機(jī),沒耳機(jī)就外放
    public void playMusic() {
        if (eraPhones != null){
            eraPhones.play();
        }else{
            System.out.println("外放");
        }

    }
    // 插個(gè)TypeC接口的耳機(jī)
    public void setEraPhones(TypeCEraPhones eraPhones) {
        this.eraPhones = eraPhones;
    }
}

這個(gè)是TypeC接口的耳機(jī)接口,聽說用這個(gè)接口的耳機(jī)都好好貴呢~~

public interface TypeCEraPhones {
    void play();
}

這個(gè)是我們以前剩下的能聽個(gè)響的3.5mm接口的耳機(jī)

public class Mi35MMEraPhones {
    public void play(){
        System.out.println("使用3.5mm孔的小米耳機(jī)播放聲音");
    }
}

怎么辦呢,是花大錢買個(gè)新的耳機(jī)(想想,如果真是個(gè)復(fù)雜的對(duì)象,重新實(shí)現(xiàn)功能是不是很頭大),還是對(duì)當(dāng)前這個(gè)3.5mm的耳機(jī)爆改,可是我還有個(gè)需要使用3.5mm的mp3 ,??,這可怎么是好……于是機(jī)智的我去淘寶發(fā)現(xiàn)了一個(gè)type-c轉(zhuǎn)3.5mm的接口,才5塊錢!!??

適配器類

public class Adapter implements TypeCEraPhones {
    private Mi35MMEraPhones eraPhones;

    public Adapter(Mi35MMEraPhones eraPhones) {
        this.eraPhones = eraPhones;
    }

    @Override
    public void play() {
        eraPhones.play();
    }
}

適配器實(shí)現(xiàn)了TypeC耳機(jī)的接口,并能把原來的耳機(jī)傳進(jìn)來,于是我們就能愉快的用原來的耳機(jī)在小米8上聽音樂了,hooooooo~而且還能我的mp3使用,美滋滋~

四、缺省適配器模式

在很多情況下,必須讓一個(gè)具體類實(shí)現(xiàn)某一個(gè)接口,但是這個(gè)類又用不到接口所規(guī)定的所有的方法。通常的處理方法是,把方法都實(shí)現(xiàn)了,有用的寫上需要的方法,沒用的提供空實(shí)現(xiàn),煩死了??

這些空的方法是一種浪費(fèi),有時(shí)也是一種混亂。只有看過這些空方法的代碼,程序員才能知道哪些是空的,哪些不是空的,于是我們可以提供一個(gè)適配器類,來為接口所有方法提供空實(shí)現(xiàn),然后這個(gè)具體類繼承適配器接口,需要哪些方法,進(jìn)行重寫就可以。

在jdk中有AbstractList這樣一個(gè)抽象類,實(shí)現(xiàn)了List接口,如果我們需要定制自己的集合類,就可以繼承這個(gè)抽象類,需要哪些方法就可以對(duì)這些方法進(jìn)行重寫,而不用對(duì)List接口下所有方法都提供空實(shí)現(xiàn)。

缺省適配器模式是一種特殊的適配器模式,目的是在不得不繼承某個(gè)方法時(shí)可以減少重寫不需要的方法。

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

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

  • 更好的復(fù)用性:系統(tǒng)需要使用現(xiàn)有的類,而此類的接口不符合系統(tǒng)的需要。那么通過適配器模式就可以讓這些功能得到更好的復(fù)用。
  • 更好的擴(kuò)展性:在實(shí)現(xiàn)適配器功能的時(shí)候,可以調(diào)用自己開發(fā)的功能,從而自然地?cái)U(kuò)展系統(tǒng)的功能。

缺點(diǎn)

  • 過多的使用適配器模式,會(huì)讓系統(tǒng)難以把控,畢竟表面上是A接口,其實(shí)內(nèi)部被適配成了B接口的實(shí)現(xiàn),一個(gè)系統(tǒng)如果太多出現(xiàn)這種情況,無異于一場災(zāi)難。

六、總結(jié)

本文對(duì)適配器模式進(jìn)行了簡要介紹,主要把握是適配器實(shí)現(xiàn)需要的接口,并與adaptee進(jìn)行組合,就可以實(shí)現(xiàn)對(duì)象適配器。在學(xué)習(xí)適配器模式過程中可以與裝飾者模式和外觀模式,適配器和裝飾者使用方法類似,但是目的完全不同,前者是將一個(gè)接口轉(zhuǎn)為另一個(gè)接,后者是為了對(duì)類進(jìn)行增強(qiáng);外觀模式目的是對(duì)外提供一個(gè)簡單的接口。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多