溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java裝飾者模式怎么實現(xiàn)

發(fā)布時間:2022-01-05 15:33:24 來源:億速云 閱讀:103 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“java裝飾者模式怎么實現(xiàn)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“java裝飾者模式怎么實現(xiàn)”吧!

定義:

    在不必改變原類文件和原類使用的繼承的情況下,動態(tài)地擴展一個對象的功能。

    它是通過創(chuàng)建一個包裝對象,也就是用裝飾來包裹真實的對象來實現(xiàn)。

角色:

    抽象構(gòu)件角色(Project):給出一個接口,以規(guī)范準備接收附加責(zé)任的對象。

    具體構(gòu)件角色(Employe):定義一個將要接收附加責(zé)任的類。

    裝飾角色(Manager):持有一個構(gòu)件對象的實例,并定義一個與抽象構(gòu)件接口一致的接口。

    具體裝飾角色(ManagerA、ManagerB):負責(zé)給構(gòu)件對象“貼上”附加的責(zé)任。

示例:

公共接口:

public interface Person {  
    void eat();  
}

被裝飾對象:

public class OldPerson implements Person {  
    @Override  
    public void eat() {  
        System.out.println("吃飯");  
    }  
}

裝飾對象:

public class NewPerson implements Person {  
    private OldPerson p;  

    NewPerson(OldPerson p) {  
        this.p = p;  
    }  

    @Override  
    public void eat() {  
        System.out.println("生火");  
        System.out.println("做飯");  
        p.eat();  
        System.out.println("刷碗");   
    }  
}

測試:

public class PersonDemo {  
    public static void main(String[] args) {  
        OldPerson old = new OldPerson();  
        //old.eat(); 
        NewPerson np = new NewPerson(old);  
        np.eat();  
    }  
}

        通過例子可以看到,沒有改變原來的OldPerson類,同時也沒有定義他的子類而實現(xiàn)了Person的擴展,這就是裝飾者模式的作用。

優(yōu)點:

        1,使用裝飾者模式比使用繼承更加靈活,因為它選擇通過一種動態(tài)的方式來擴展一個對象的功能,在運行時可以選擇不同的裝飾器,從而實現(xiàn)不同的行為。

        2,通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創(chuàng)造出很多不同行為的組合。可以使用多個具體裝飾類來裝飾同一對象,得到功能更為強大的對象。

        3,具體構(gòu)件類與具體裝飾類可以獨立變化,他能是低耦合的。用戶可以根據(jù)需要來增加新的具體構(gòu)件類和具體裝飾類,在使用時再對其進行各種組合,原有代碼無須改變,符合“開閉原則”。

缺點:

        1,會產(chǎn)生很多的小對象,增加了系統(tǒng)的復(fù)雜性

        2,這種比繼承更加靈活機動的特性,也同時意味著裝飾模式比繼承更加易于出錯,排錯也很困難,對于多次裝飾的對象,調(diào)試時尋找錯誤可能需要逐級排查,較為煩瑣。

裝飾者與適配者模式的區(qū)別:

   1,適配器模式主要用來兼容那些不能在一起工作的類,使他們轉(zhuǎn)化為可以兼容目標接口,雖然也可以實現(xiàn)和裝飾者一樣的增加新職責(zé),但目的不在此。

        裝飾者模式主要是給被裝飾者增加新職責(zé)的。

   2,適配器模式是用新接口來調(diào)用原接口,原接口對新系統(tǒng)是不可見或者說不可用的。

        裝飾者模式原封不動的使用原接口,系統(tǒng)對裝飾的對象也通過原接口來完成使用。

   3,適配器是知道被適配者的詳細情況的(就是那個類或那個接口)。

        裝飾者只知道其接口是什么,至于其具體類型(是基類還是其他派生類)只有在運行期間才知道。

裝飾者和繼承的區(qū)別:

繼承:

  優(yōu)點:代碼結(jié)構(gòu)清晰,而且實現(xiàn)簡單

  缺點:對于每一個的需要增強的類都要創(chuàng)建具體的子類來幫助其增強,這樣會導(dǎo)致繼承體系過于龐大。

裝飾者:

  優(yōu)點:內(nèi)部可以通過多態(tài)技術(shù)對多個需要增強的類進行增強

       缺點:需要內(nèi)部通過多態(tài)技術(shù)維護需要增強的類的實例。進而使得代碼稍微復(fù)雜。

使用場景:

        1,需要擴展一個類的功能,或給一個類添加附加職責(zé)。

        2,需要動態(tài)的給一個對象添加功能,這些功能可能不明確或者暫時的,可以隨時很方便的動態(tài)撤銷掉。

        3,需要增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能,從而使繼承關(guān)系變的不現(xiàn)實。

        4. 當不能采用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用于生成子類。

到此,相信大家對“java裝飾者模式怎么實現(xiàn)”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI