《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》之裝飾者模式

概念:可以動(dòng)態(tài)地給某個(gè)對(duì)象添加一些額外的職責(zé),而不會(huì)影響從這個(gè)類中派生的其他對(duì)象。

出現(xiàn)原因:在裝飾者出現(xiàn)之前,我們都是用繼承給對(duì)象添加功能,但是繼承也不是萬(wàn)能的,會(huì)出現(xiàn)一些瑕疵,裝飾者模式的出現(xiàn)就恰恰彌補(bǔ)了這些瑕疵。

  1. 繼承的超類和子類之間存在強(qiáng)耦合性,當(dāng)超類改變時(shí),子類也會(huì)隨之改變;
  2. 繼承的超類的內(nèi)部細(xì)節(jié)對(duì)子類是可見的,會(huì)被認(rèn)為破壞了封裝性。

舉栗子(假設(shè)我們?cè)诰帉懸粋€(gè)飛機(jī)大戰(zhàn)的游戲,隨著經(jīng)驗(yàn)值的增加,我們操作的飛機(jī)對(duì)象可以升級(jí)成更厲害的飛機(jī),一開始這些飛機(jī)只能發(fā)射普通的子彈,升到第二級(jí)時(shí)可以發(fā)射導(dǎo)彈,升到第三級(jí)時(shí)可以發(fā)射原子彈。):

var plane = {
 fire: function(){
 console.log( '發(fā)射普通子彈' );
 }
}
var missileDecorator = function(){
 console.log( '發(fā)射導(dǎo)彈' );
}
var atomDecorator = function(){
 console.log( '發(fā)射原子彈' );
}
var fire1 = plane.fire;
plane.fire = function(){
 fire1();
 missileDecorator();
}
var fire2 = plane.fire;
plane.fire = function(){
 fire2();
 atomDecorator();
}
plane.fire();
// 分別輸出: 發(fā)射普通子彈、發(fā)射導(dǎo)彈、發(fā)射原子彈

裝飾者模式和代理模式看起來(lái)相像,但它們有明顯的不同:
代理模式的目的是,當(dāng)直接訪問(wèn)本體不方便或者不符合需要時(shí),為這個(gè)本體提供一個(gè)替代者。本體定義了關(guān)鍵功能,而代理提供或拒絕對(duì)它的訪問(wèn),或者在訪問(wèn)本體之前做一些額外的事情。
裝飾者模式的作用就是為對(duì)象動(dòng)態(tài)加入行為,裝飾者模式用于一開始不能確定對(duì)象的全部功能時(shí)。。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我氣的不是你詆毀我,而是你因?yàn)橐患虑槭ダ碇?/div>
    牛奶Oo面包閱讀 199評(píng)論 0 0
  • 昨晚在給寶寶洗腳的時(shí)候無(wú)意問(wèn)了他一個(gè)問(wèn)題:你喜歡什么樣的媽媽???他不假思索地說(shuō):“任何時(shí)候。” 其實(shí)聽到這樣的回答...
    莫莫豆丁閱讀 226評(píng)論 0 0
  • 她向往哪樣生活,連她自己都不知道。好像她從出生到她二十五歲時(shí),她的父母親就沒(méi)有教過(guò)她,學(xué)校里的老師也沒(méi)教,她上大學(xué)...
    Mr_稻香老農(nóng)閱讀 1,250評(píng)論 81 114
  • 朋友們還是沒(méi)能適應(yīng)“嘻嘻”這個(gè)名字,不管是有意還是無(wú)意,每次都問(wèn)我家“淑芬”最近怎么樣了。作為一只貓它無(wú)法選擇自己...
    光澤叔叔閱讀 786評(píng)論 2 6

友情鏈接更多精彩內(nèi)容