JavaScript設(shè)計(jì)模式之裝飾者模式介紹
裝飾者模式說明
說明:通一個(gè)類來動(dòng)態(tài)的對(duì)另一個(gè)類的功能對(duì)象進(jìn)行前或后的修飾,給它輔加一些額外的功能; 這是對(duì)一個(gè)類對(duì)象功能的裝飾,裝飾的類跟被裝飾的類,要求擁有相同的訪問接口方法(功能),這在動(dòng)態(tài)面向?qū)ο箢惱?,一般以?shí)現(xiàn)同一個(gè)接口(interface)來約束實(shí)現(xiàn);裝飾類的要有對(duì)被裝飾類的引用,用于在裝飾類的相應(yīng)方法,調(diào)用相應(yīng)被裝飾類的方法,然后對(duì)其進(jìn)行修飾;
場(chǎng)景舉例:
1>. 比如我們生活中的穿衣服, 一件襯衣,一件西裝外套,一條褲子,一條領(lǐng)帶,一雙漂亮的皮鞋; 每多穿一件,都是對(duì)前面一件或全身的裝飾;
2>. 比如我們有個(gè)類下的功能方法,可能用于寫日志,可能用于用戶登陸這樣的功能,也許寫入日志前需要獲取當(dāng)前操作者信息,或是登錄成功后,寫入一條日志;寫入日志之前的額外操作,它的總體來說也還是一個(gè)寫日志的目的;登孫成功后寫日志,它總體上也是一個(gè)登錄過程的操作信息;
因此裝飾者模式用于實(shí)現(xiàn),兩者相似操作的一種場(chǎng)景;就是裝飾者對(duì)被裝飾者功能對(duì)象的擴(kuò)展,本質(zhì)還是原方法相同的功能范圍;
實(shí)例源碼
1. 被裝飾者類
function Wear() {
}
Wear.prototype.Shirt = function() {
//穿了件襯衫
console.log('穿上襯衫');
}
2. 裝飾者類
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ì)其輔加的額外功能是什么就可以;
其他說明
裝飾者模式,真正提現(xiàn)了面向?qū)ο蠓椒ǖ模簩?duì)擴(kuò)展開放,對(duì)修改關(guān)閉的原則;所有想要的功能方法,都是在沒有修改[被裝飾類Wear]在擴(kuò)展[裝飾者這個(gè)類Decorator]的情況下進(jìn)行的;
裝飾者模式的一個(gè)主要特點(diǎn),就是裝飾者對(duì)被裝飾者的引用,以實(shí)現(xiàn)對(duì)被裝飾者的無修改裝飾;
模擬下:先穿襯衫,再穿領(lǐng)帶,再穿西裝的場(chǎng)景: 上面的被裝飾者不變了:
2. 裝飾者類:
function Decorator(wear) {
this.wear = wear;
}
Decorator.prototype.Shirt = function() {
this.wear.Shirt(); //這里只穿襯衫;
}
3. 創(chuàng)建類似繼承 Decorator 子類的 穿領(lǐng)帶類與穿西裝類
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實(shí)現(xiàn)將圖片轉(zhuǎn)為base64格式
Base64是一種用64個(gè)字符來表示任意二進(jìn)制數(shù)據(jù)的方法,這篇文章主要為大家介紹了如何實(shí)現(xiàn)將圖片轉(zhuǎn)為base64格式,感興趣的小伙伴可以學(xué)習(xí)一下2023-07-07JavaScript學(xué)習(xí)總結(jié)(一) ECMAScript、BOM、DOM(核心、瀏覽器對(duì)象模型與文檔對(duì)象模型)
JavaScript是一種解釋執(zhí)行的腳本語言,是一種動(dòng)態(tài)類型、弱類型、基于原型的語言,內(nèi)置支持類型,它遵循ECMAScript標(biāo)準(zhǔn)。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用于客戶端的腳本語言,主要用來給HTML增加動(dòng)態(tài)功能2018-01-01file模式訪問網(wǎng)頁時(shí)iframe高度自適應(yīng)解決方案
最近做到iframe的高度自適應(yīng)這個(gè)問題;發(fā)現(xiàn)自己做的網(wǎng)頁是通過file方式訪問的,將網(wǎng)頁代碼放到apache下通過http協(xié)議訪問,在iframe加載的時(shí)候調(diào)用如下js方法:果然網(wǎng)頁高度能夠自適應(yīng)(對(duì)于其他方案應(yīng)該也有效果,我沒有注意去嘗試)感興趣的朋友可以了解下2013-01-01讓javascript加載速度倍增的方法(解決JS加載速度慢的問題)
這篇文章主要介紹了讓javascript加載速度倍增的方法,通過document.write輸出js解決廣告加載速度慢的問題,需要的朋友可以參考下2014-12-12JavaScript實(shí)現(xiàn)單點(diǎn)登錄的示例
這篇文章主要介紹了JavaScript實(shí)現(xiàn)單點(diǎn)登錄的示例,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下2020-09-09JS實(shí)現(xiàn)字符串轉(zhuǎn)駝峰格式的方法
這篇文章主要介紹了JS實(shí)現(xiàn)字符串轉(zhuǎn)駝峰格式的方法,結(jié)合實(shí)例形式分析了傳統(tǒng)的字符串遍歷轉(zhuǎn)換及正則替換兩種操作技巧,需要的朋友可以參考下2016-12-12javascript實(shí)現(xiàn)label標(biāo)簽跳出循環(huán)操作
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)label標(biāo)簽跳出循環(huán)操作,感興趣的朋友可以參考一下2016-03-03javascript中this做事件參數(shù)相關(guān)問題解答
有關(guān)this想必大家早有所耳聞,只不過在使用中不是那么在意而已,接下來為大家介紹下this做事件參數(shù)問題,感興趣的你可不要錯(cuò)過了哈2013-03-03JS中間件設(shè)計(jì)模式的深入探討與實(shí)例分析
這篇文章主要介紹了JS中間件設(shè)計(jì)模式,結(jié)合實(shí)例形式分析了JS中間件設(shè)計(jì)模式功能、原理、應(yīng)用場(chǎng)景及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-04-04