摘要:作者按每天一個設計模式旨在初步領會設計模式的精髓,目前采用和兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式原文地址是每天一個設計模式之裝飾者模式歡迎關注個人技術博客。
作者按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前采用javascript和python兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :)
原文地址是:《每天一個設計模式之裝飾者模式》
歡迎關注個人技術博客:godbmw.com。每周 1 篇原創技術分享!開源教程(webpack、設計模式)、面試刷題(偏前端)、知識整理(每周零碎),歡迎長期關注!
如果您也想進行知識整理 + 搭建功能完善/設計簡約/快速啟動的個人博客,請直接戳theme-bmw
0. 項目地址裝飾者模式·代碼
《每天一個設計模式》地址
1. 什么是“裝飾者模式”?裝飾者模式:在不改變對象自身的基礎上,動態地添加功能代碼。
根據描述,裝飾者顯然比繼承等方式更靈活,而且不污染原來的代碼,代碼邏輯松耦合。
2. 應用場景裝飾者模式由于松耦合,多用于一開始不確定對象的功能、或者對象功能經常變動的時候。
尤其是在參數檢查、參數攔截等場景。
ES6的裝飾器語法規范只是在“提案階段”,而且不能裝飾普通函數或者箭頭函數。
下面的代碼,addDecorator可以為指定函數增加裝飾器。
其中,裝飾器的觸發可以在函數運行之前,也可以在函數運行之后。
注意:裝飾器需要保存函數的運行結果,并且返回。
const addDecorator = (fn, before, after) => { let isFn = fn => typeof fn === "function"; if (!isFn(fn)) { return () => {}; } return (...args) => { let result; // 按照順序執行“裝飾函數” isFn(before) && before(...args); // 保存返回函數結果 isFn(fn) && (result = fn(...args)); isFn(after) && after(...args); // 最后返回結果 return result; }; }; /******************以下是測試代碼******************/ 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 實現
python直接提供裝飾器的語法支持。用法如下:
# 不帶參數 def log_without_args(func): def inner(*args, **kw): print("args are %s, %s" % (args, kw)) return func(*args, **kw) return inner # 帶參數 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()
其實python中的裝飾器的實現,也是通過“閉包”實現的。
以上述代碼中的now1函數為例,裝飾器與下列語法等價:
# .... def now1(): print("call function now without args") # ... now_without_args = log_without_args(now1) # 返回被裝飾后的 now1 函數 now_without_args() # 輸出與前面代碼相同4. 參考
JavaScript Decorators: What They Are and When to Use Them
《阮一峰ES6-Decorator》
《廖雪峰python-Decorator》
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101373.html
摘要:作者按每天一個設計模式旨在初步領會設計模式的精髓,目前采用和兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式原文地址是每天一個設計模式之裝飾者模式歡迎關注個人技術博客。 作者按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前采用javascript和python兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式...
摘要:相關設計模式裝飾者模式和代理模式裝飾者模式關注再一個對象上動態添加方法代理模式關注再對代理對象的控制訪問,可以對客戶隱藏被代理類的信息裝飾著模式和適配器模式都叫包裝模式關于新職責適配器也可以在轉換時增加新的職責,但主要目的不在此。 0x01.定義與類型 定義:裝飾模式指的是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的...
摘要:裝飾者模式組成結構抽象構件給出抽象接口或抽象類,以規范準備接收附加功能的對象。裝飾者模式圖解裝飾者模式應用場景需要擴展一個類的功能,或給一個類添加附加職責。裝飾者對象接受所有來自客戶端的請求。參考資料設計模式 一、了解裝飾者模式 1.1 什么是裝飾者模式 裝飾者模式指的是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾者來包裹真實的對...
摘要:什么是裝飾者模式今天我們來講另外一個非常實用的設計模式裝飾者模式。就增加功能來說,裝飾者模式相比生成子類更為靈活。下面,裝飾者模式就要正式登場了。下一步,我們可以愉快的去使用裝飾者模式啦 什么是裝飾者模式 今天我們來講另外一個非常實用的設計模式:裝飾者模式。這個名字聽上去有些莫名其妙,不著急,我們先來記住它的一個別名:包裝器模式。 我們記著這兩個名字來開始今天的文章。 首先還是上《設計...
閱讀 2591·2021-09-26 10:17
閱讀 3220·2021-09-22 15:16
閱讀 2130·2021-09-03 10:43
閱讀 3257·2019-08-30 11:23
閱讀 3657·2019-08-29 13:23
閱讀 1301·2019-08-29 11:31
閱讀 3686·2019-08-26 13:52
閱讀 1394·2019-08-26 12:22