JavaScript設(shè)計(jì)模式之裝飾者模式介紹
裝飾者模式說(shuō)明
說(shuō)明:通一個(gè)類(lèi)來(lái)動(dòng)態(tài)的對(duì)另一個(gè)類(lèi)的功能對(duì)象進(jìn)行前或后的修飾,給它輔加一些額外的功能; 這是對(duì)一個(gè)類(lèi)對(duì)象功能的裝飾,裝飾的類(lèi)跟被裝飾的類(lèi),要求擁有相同的訪問(wèn)接口方法(功能),這在動(dòng)態(tài)面向?qū)ο箢?lèi)里,一般以實(shí)現(xiàn)同一個(gè)接口(interface)來(lái)約束實(shí)現(xiàn);裝飾類(lèi)的要有對(duì)被裝飾類(lèi)的引用,用于在裝飾類(lèi)的相應(yīng)方法,調(diào)用相應(yīng)被裝飾類(lèi)的方法,然后對(duì)其進(jìn)行修飾;
場(chǎng)景舉例:
1>. 比如我們生活中的穿衣服, 一件襯衣,一件西裝外套,一條褲子,一條領(lǐng)帶,一雙漂亮的皮鞋; 每多穿一件,都是對(duì)前面一件或全身的裝飾;
2>. 比如我們有個(gè)類(lèi)下的功能方法,可能用于寫(xiě)日志,可能用于用戶登陸這樣的功能,也許寫(xiě)入日志前需要獲取當(dāng)前操作者信息,或是登錄成功后,寫(xiě)入一條日志;寫(xiě)入日志之前的額外操作,它的總體來(lái)說(shuō)也還是一個(gè)寫(xiě)日志的目的;登孫成功后寫(xiě)日志,它總體上也是一個(gè)登錄過(guò)程的操作信息;
因此裝飾者模式用于實(shí)現(xiàn),兩者相似操作的一種場(chǎng)景;就是裝飾者對(duì)被裝飾者功能對(duì)象的擴(kuò)展,本質(zhì)還是原方法相同的功能范圍;
實(shí)例源碼
1. 被裝飾者類(lèi)
function Wear() {
}
Wear.prototype.Shirt = function() {
//穿了件襯衫
console.log('穿上襯衫');
}
2. 裝飾者類(lèi)
function Decorator(wear) {
this.wear = wear;
}
Decorator.prototype.Shirt = function() {
this.wear.Shirt();
//穿了件襯衫后,我又加上了領(lǐng)帶
}
3. 使用方法
var wear = new Wear();
var decorator = new Decorator(wear);
decorator.Shirt();
這樣就實(shí)現(xiàn)了對(duì) Wear 穿襯衫這個(gè)功能對(duì)象的動(dòng)態(tài)擴(kuò)展裝飾,你也不必知道原被裝飾方法是如何執(zhí)行,只要知道它的功能是什么就可以,然后知道我們要對(duì)其輔加的額外功能是什么就可以;
其他說(shuō)明
裝飾者模式,真正提現(xiàn)了面向?qū)ο蠓椒ǖ模簩?duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉的原則;所有想要的功能方法,都是在沒(méi)有修改[被裝飾類(lèi)Wear]在擴(kuò)展[裝飾者這個(gè)類(lèi)Decorator]的情況下進(jìn)行的;
裝飾者模式的一個(gè)主要特點(diǎn),就是裝飾者對(duì)被裝飾者的引用,以實(shí)現(xiàn)對(duì)被裝飾者的無(wú)修改裝飾;
模擬下:先穿襯衫,再穿領(lǐng)帶,再穿西裝的場(chǎng)景: 上面的被裝飾者不變了:
2. 裝飾者類(lèi):
function Decorator(wear) {
this.wear = wear;
}
Decorator.prototype.Shirt = function() {
this.wear.Shirt(); //這里只穿襯衫;
}
3. 創(chuàng)建類(lèi)似繼承 Decorator 子類(lèi)的 穿領(lǐng)帶類(lèi)與穿西裝類(lèi)
function Decorator_Tie(decorator) {
this.decorator = decorator;
}
Decorator_Tie.prototype.Shirt = function() {
this.decorator.Shirt(); //穿上襯衫
console.log('再戴上領(lǐng)帶');
}
function Decorator_Western (decorator) {
this.decorator = decorator;
}
Decorator_Western.prototype.Shirt = function() {
this.decorator.Shirt();
console.log('再穿上西裝');
}
使用方法:
//先穿上襯衫
var wear = new Wear();
var decorator = new Decorator(wear);
//decorator.Shirt();
//再戴上領(lǐng)帶
var tie = new Decorator_Tie(decorator);
//tie.Shirt();
//再穿上西裝
var western = new Decorator_Western(tie);
western.Shirt();
這就是一個(gè)穿衣服裝飾的模擬例子;
相關(guān)文章
JS觸發(fā)事件event.target VS event.currentTarget實(shí)例
這篇文章主要介紹了JS觸發(fā)事件event.target VS event.currentTarget實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
JavaScript通過(guò)Date-Mask將日期轉(zhuǎn)換成字符串的方法
這篇文章主要介紹了JavaScript通過(guò)Date-Mask將日期轉(zhuǎn)換成字符串的方法,涉及javascript日期、數(shù)組及字符串操作的相關(guān)技巧,需要的朋友可以參考下2015-06-06
uniapp微信小程序無(wú)法使用本地靜態(tài)資源圖片(背景圖在真機(jī)不顯示)的解決方法
寫(xiě)微信小程序的時(shí)候,難免會(huì)為了趕進(jìn)度而直接使用本地的圖片,在模擬器上的時(shí)候可以正確顯示圖片,但是到手機(jī)上就無(wú)法顯示圖片了,下面這篇文章主要給大家介紹了關(guān)于uniapp微信小程序無(wú)法使用本地靜態(tài)資源圖片(背景圖在真機(jī)不顯示)的方法,需要的朋友可以參考下2022-12-12
解讀input標(biāo)簽的value屬性及name屬性
這篇文章主要介紹了解讀input標(biāo)簽的value屬性,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
微信小程序input、textarea層級(jí)過(guò)高穿透的問(wèn)題解決
微信小程序原生組件camera、canvas、input、live-player、live、pusher、map、textarea、video的層級(jí)是最高的,那么如何解決微信小程序input、textarea層級(jí)過(guò)高穿透,本文就詳細(xì)的介紹一下2021-11-11
Node.js實(shí)戰(zhàn) 建立簡(jiǎn)單的Web服務(wù)器
本章我們同樣通過(guò)實(shí)戰(zhàn)的演練,利用Node.js建立一個(gè)簡(jiǎn)單的Web服務(wù)器2012-03-03
javascript中全局對(duì)象的isNaN()方法使用介紹
全局對(duì)象的isNaN()方法通常用于檢測(cè) parseFloat() 和 parseInt() 的結(jié)果,下面為大家介紹下其具體的使用,感興趣的朋友可以參考下2013-12-12

