概念:可以動態(tài)地給某個對象添加一些額外的職責(zé)懈词,而不會影響從這個類中派生的其他對象谴供。
出現(xiàn)原因:在裝飾者出現(xiàn)之前脂信,我們都是用繼承給對象添加功能,但是繼承也不是萬能的剥险,會出現(xiàn)一些瑕疵聪蘸,裝飾者模式的出現(xiàn)就恰恰彌補(bǔ)了這些瑕疵。
- 繼承的超類和子類之間存在強(qiáng)耦合性表制,當(dāng)超類改變時健爬,子類也會隨之改變;
- 繼承的超類的內(nèi)部細(xì)節(jié)對子類是可見的夫凸,會被認(rèn)為破壞了封裝性浑劳。
舉栗子(假設(shè)我們在編寫一個飛機(jī)大戰(zhàn)的游戲阱持,隨著經(jīng)驗值的增加夭拌,我們操作的飛機(jī)對象可以升級成更厲害的飛機(jī),一開始這些飛機(jī)只能發(fā)射普通的子彈衷咽,升到第二級時可以發(fā)射導(dǎo)彈鸽扁,升到第三級時可以發(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ā)射原子彈
裝飾者模式和代理模式看起來相像,但它們有明顯的不同:
代理模式的目的是鼎姊,當(dāng)直接訪問本體不方便或者不符合需要時骡和,為這個本體提供一個替代者。本體定義了關(guān)鍵功能相寇,而代理提供或拒絕對它的訪問慰于,或者在訪問本體之前做一些額外的事情。
裝飾者模式的作用就是為對象動態(tài)加入行為唤衫,裝飾者模式用于一開始不能確定對象的全部功能時婆赠。。