<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è)例子舉得不太好可能不利于理解,不過沒想到更好的呢,想到再寫~