裝飾模式 -電腦資料

電腦資料 時(shí)間:2019-01-01 我要投稿
【clearvueentertainment.com - 電腦資料】

   

<code class="hljs">裝飾模式-動(dòng)態(tài)的給對(duì)象添加新功能,

裝飾模式

。</code>

    裝飾:所謂錦上添花,裝飾就是給加上“花”而它的核心本質(zhì)還是“錦”。

    那么難免就有一個(gè)疑問那就直接加花就可以了啊,為什么要弄一個(gè)裝飾模式出來呢?

    舉個(gè)例子:一個(gè)家伙要和面,準(zhǔn)備蒸個(gè)饅頭吃吃。然后準(zhǔn)備一些面,加水,呀,水多了,加面…無窮盡也~

    我們把裝飾單獨(dú)拿出來實(shí)現(xiàn)主體和附加功能的分離,在不使主體變得臃腫的情況下添加需要的新功能。再拿蒸饅頭舉例,蒸饅頭吃的是面,那面就是主體,以這個(gè)面為核心,我們加點(diǎn)配料或者加個(gè)陷,或者弄幾個(gè)花紋美化一下。如果不把裝飾拿出來是什么樣的呢:

<code class="hljs" php="">class ManTou{    addMian();}class addHuaWen extends ManTou{    addMian();    ---------    addHuawen();}class addRouXian extends ManTou{    addMian();    ----------    addRouXian();}</code>

    這樣我們就反復(fù)使用主體,進(jìn)入加面加水的循環(huán),雖然達(dá)到了我們要加配料的目的,但是主體被濫用了,你可能只想做兩個(gè)饅頭,最后蒸了一鍋。

    看看裝飾模式,饅頭還是那個(gè)饅頭,沒有引發(fā)血案,只是個(gè)饅頭

<code class="hljs" scala="">class ManTou{    addMian();}class decorator extends ManTou{    protected ManTou manTOu;    makeManTou(ManTou manTou) {        this.manTou = mantou;    }    @Override    addMian();}class addHuawen extends decorator{    @Override    addMian(){        super.addMian();        addHuawen();}class addRouXian extends decorator{    @Override    addMian() {        super.addMian();        addRouXian();}</code>

    體現(xiàn)裝飾模式的優(yōu)勢(shì)就在客戶端的代碼了:

<code class="hljs" cs="">static void main(String[] args) {    ManTou m = new ManTou();    addHuaWen h = new addHuaWen();    addRouXian r = new addRouXian();    h.makeManTou(m);    r.makeManTou(h);    r.addMian();</code>

    通過客戶端的實(shí)現(xiàn)可以發(fā)現(xiàn)就像穿衣服一樣,一層套一層的加上去了我們的新需求,當(dāng)你再想加個(gè)顏色,只要再寫一個(gè)addColor()即可,客戶端修改一下即可,不需要去動(dòng)addMian()這個(gè)主體,符合了開放和封閉原則,

電腦資料

裝飾模式》(http://clearvueentertainment.com)。

    Uh… 最后想想做饅頭這個(gè)例子舉得不太好可能不利于理解,不過沒想到更好的呢,想到再寫~

最新文章