摘要:作者按每天一個(gè)設(shè)計(jì)模式旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用和兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式原文地址是每天一個(gè)設(shè)計(jì)模式之裝飾者模式歡迎關(guān)注個(gè)人技術(shù)博客。
作者按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript和python兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式 :)
原文地址是:《每天一個(gè)設(shè)計(jì)模式之裝飾者模式》
歡迎關(guān)注個(gè)人技術(shù)博客:godbmw.com。每周 1 篇原創(chuàng)技術(shù)分享!開源教程(webpack、設(shè)計(jì)模式)、面試刷題(偏前端)、知識(shí)整理(每周零碎),歡迎長期關(guān)注!
如果您也想進(jìn)行知識(shí)整理 + 搭建功能完善/設(shè)計(jì)簡約/快速啟動(dòng)的個(gè)人博客,請(qǐng)直接戳theme-bmw
0. 項(xiàng)目地址裝飾者模式·代碼
《每天一個(gè)設(shè)計(jì)模式》地址
1. 什么是“裝飾者模式”?裝飾者模式:在不改變對(duì)象自身的基礎(chǔ)上,動(dòng)態(tài)地添加功能代碼。
根據(jù)描述,裝飾者顯然比繼承等方式更靈活,而且不污染原來的代碼,代碼邏輯松耦合。
2. 應(yīng)用場(chǎng)景裝飾者模式由于松耦合,多用于一開始不確定對(duì)象的功能、或者對(duì)象功能經(jīng)常變動(dòng)的時(shí)候。
尤其是在參數(shù)檢查、參數(shù)攔截等場(chǎng)景。
ES6的裝飾器語法規(guī)范只是在“提案階段”,而且不能裝飾普通函數(shù)或者箭頭函數(shù)。
下面的代碼,addDecorator可以為指定函數(shù)增加裝飾器。
其中,裝飾器的觸發(fā)可以在函數(shù)運(yùn)行之前,也可以在函數(shù)運(yùn)行之后。
注意:裝飾器需要保存函數(shù)的運(yùn)行結(jié)果,并且返回。
const addDecorator = (fn, before, after) => { let isFn = fn => typeof fn === "function"; if (!isFn(fn)) { return () => {}; } return (...args) => { let result; // 按照順序執(zhí)行“裝飾函數(shù)” isFn(before) && before(...args); // 保存返回函數(shù)結(jié)果 isFn(fn) && (result = fn(...args)); isFn(after) && after(...args); // 最后返回結(jié)果 return result; }; }; /******************以下是測(cè)試代碼******************/ const beforeHello = (...args) => { console.log(`Before Hello, args are ${args}`); }; const hello = (name = "user") => { console.log(`Hello, ${name}`); return name; }; const afterHello = (...args) => { console.log(`After Hello, args are ${args}`); }; const wrappedHello = addDecorator(hello, beforeHello, afterHello); let result = wrappedHello("godbmw.com"); console.log(result);3.2 Python3 實(shí)現(xiàn)
python直接提供裝飾器的語法支持。用法如下:
# 不帶參數(shù) def log_without_args(func): def inner(*args, **kw): print("args are %s, %s" % (args, kw)) return func(*args, **kw) return inner # 帶參數(shù) def log_with_args(text): def decorator(func): def wrapper(*args, **kw): print("decorator"s arg is %s" % text) print("args are %s, %s" % (args, kw)) return func(*args, **kw) return wrapper return decorator @log_without_args def now1(): print("call function now without args") @log_with_args("execute") def now2(): print("call function now2 with args") if __name__ == "__main__": now1() now2()
其實(shí)python中的裝飾器的實(shí)現(xiàn),也是通過“閉包”實(shí)現(xiàn)的。
以上述代碼中的now1函數(shù)為例,裝飾器與下列語法等價(jià):
# .... def now1(): print("call function now without args") # ... now_without_args = log_without_args(now1) # 返回被裝飾后的 now1 函數(shù) now_without_args() # 輸出與前面代碼相同4. 參考
JavaScript Decorators: What They Are and When to Use Them
《阮一峰ES6-Decorator》
《廖雪峰python-Decorator》
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43068.html
摘要:作者按每天一個(gè)設(shè)計(jì)模式旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用和兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式原文地址是每天一個(gè)設(shè)計(jì)模式之裝飾者模式歡迎關(guān)注個(gè)人技術(shù)博客。 作者按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript和python兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式...
摘要:相關(guān)設(shè)計(jì)模式裝飾者模式和代理模式裝飾者模式關(guān)注再一個(gè)對(duì)象上動(dòng)態(tài)添加方法代理模式關(guān)注再對(duì)代理對(duì)象的控制訪問,可以對(duì)客戶隱藏被代理類的信息裝飾著模式和適配器模式都叫包裝模式關(guān)于新職責(zé)適配器也可以在轉(zhuǎn)換時(shí)增加新的職責(zé),但主要目的不在此。 0x01.定義與類型 定義:裝飾模式指的是在不必改變?cè)愇募褪褂美^承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來包裹真實(shí)的...
摘要:裝飾者模式組成結(jié)構(gòu)抽象構(gòu)件給出抽象接口或抽象類,以規(guī)范準(zhǔn)備接收附加功能的對(duì)象。裝飾者模式圖解裝飾者模式應(yīng)用場(chǎng)景需要擴(kuò)展一個(gè)類的功能,或給一個(gè)類添加附加職責(zé)。裝飾者對(duì)象接受所有來自客戶端的請(qǐng)求。參考資料設(shè)計(jì)模式 一、了解裝飾者模式 1.1 什么是裝飾者模式 裝飾者模式指的是在不必改變?cè)愇募褪褂美^承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾者來包裹真實(shí)的對(duì)...
摘要:什么是裝飾者模式今天我們來講另外一個(gè)非常實(shí)用的設(shè)計(jì)模式裝飾者模式。就增加功能來說,裝飾者模式相比生成子類更為靈活。下面,裝飾者模式就要正式登場(chǎng)了。下一步,我們可以愉快的去使用裝飾者模式啦 什么是裝飾者模式 今天我們來講另外一個(gè)非常實(shí)用的設(shè)計(jì)模式:裝飾者模式。這個(gè)名字聽上去有些莫名其妙,不著急,我們先來記住它的一個(gè)別名:包裝器模式。 我們記著這兩個(gè)名字來開始今天的文章。 首先還是上《設(shè)計(jì)...
閱讀 2714·2021-11-17 17:01
閱讀 2092·2021-09-28 09:35
閱讀 3600·2021-09-01 11:04
閱讀 859·2020-06-22 14:41
閱讀 2983·2019-08-30 15:55
閱讀 2596·2019-08-30 15:43
閱讀 2319·2019-08-26 13:54
閱讀 2515·2019-08-26 13:48