DesignPatterns - Decorator
Decorator(裝飾) — 物件結構型模式
動態地給一個物件新增一些額外的職責。就增加功能來說,Decorator 模式相比生成子類更為靈活。
適用場景
- 在不影響其他物件的情況下,以動態,透明的方式給單個物件新增職責。
- 處理那些可以撤銷的職責。
- 當不能採用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴充套件,為支援每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能類定義被隱藏,或類定義不能用於生成子類。
UML 圖
效果
- 比靜態繼承更靈活
- 避免在層次結構高層的類有太多的特徵:Decorator 模式提供了一種“即用即付” 的方法來新增職責。它並不試圖在一個複雜的可定製的類中支援所有可預見的特徵,相反,你可以定義一個簡單的類,並且用 Decorator 類給它逐漸地新增功能。
- Decorator 與它的 Component 不一樣,Decorator 雖然是一個透明的包裝,但我們從物件標識的觀點出發,一個被裝飾了的元件與這個元件是有差別的,因此,使用裝飾時不應該依賴物件標識。
實現
使用 Decorator 模式時應注意以下幾點:
- 介面的一致性:裝飾物件的介面必須與它所裝飾的 Component 的介面是一致的,所有的 ConcreteDecorator類必須有一個公共的父類。(至少在C++中如此)
- 保持 Component 類的簡單性:為了保證介面的一致性,元件和裝飾必須有一個公共的 Component 父類。因此保持這個類的簡單性是很重要的,即它應集中於定義介面而不是儲存資料。對資料表示的定義應延遲到子類中,否則 Component 類會變得過於複雜和龐大,因而難以大量使用。
- 改變物件外殼與改變物件核心:Decorator可以看做是一個物件的外殼,它可以改變這個物件的行為。另一種方法是改變物件的核心,即 Strategy 模式。
當 Component 類原本就很龐大時,使用 Decorator 模式代價太高,Strategy 模式相對好一些。在 Strategy 模式中,元件將它的一些行為轉發給一個獨立的策略物件,我們可以替換策略物件,從而改變或擴充元件的功能。
實現略。
相關文章
- TypeScript 的 DecoratorTypeScript
- vue-property-decoratorVue
- 深入淺出decorator
- 當class properties遇上decorator
- 裝飾模式 (Decorator Pattern)模式
- 裝飾器模式(Decorator)模式
- decorator-裝飾器
- Decorator裝飾設計模式設計模式
- python 之裝飾器(decorator)Python
- vue-property-decorator使用指南Vue
- python函式修飾器(decorator)Python函式
- 裝飾器vue-property-decoratorVue
- vue-property-decorator基礎教程Vue
- Vue-Property-Decorator原始碼分析Vue原始碼
- JavaScript中的裝飾器--DecoratorJavaScript
- ES7 Decorator 應用小結
- 設計模式--裝飾模式(Decorator Pattern)設計模式
- 如何用 Decorator 裝飾你的 TypescriptTypeScript
- 轉載-Java設計模式之DecoratorJava設計模式
- 設計模式-裝飾模式(Decorator Pattern)設計模式
- python裝飾器decorator的應用Python
- PHP設計模式- Decorator 裝飾器模式PHP設計模式
- ES6裝飾器Decorator基本用法
- 搭建node服務(四):Decorator裝飾器
- decorator(修飾器)的業務應用
- Taro下利用Decorator快速實現小程式分享
- 前端常用設計模式(1)--裝飾器(decorator)前端設計模式
- quarkus依賴注入之八:裝飾器(Decorator)依賴注入
- 設計模式之裝飾器模式(decorator pattern)設計模式
- PHP設計模式之裝飾器模式(Decorator)PHP設計模式
- 利用Decorator和SourceMap優化JavaScript錯誤堆疊優化JavaScript
- Decorator:從原理到實踐,我一點都不虛~
- 學習 ES7 語法 decorator 裝飾器
- 09 結構型模式之裝飾者模式(decorator)模式
- C#設計模式-裝飾器模式(Decorator Pattern)C#設計模式
- 利用LSTM思想來做CNN剪枝,北大提出Gate DecoratorCNN
- 黃金搭檔 -- JS 裝飾器(Decorator)與Node.js路由Node.js路由
- 你是怎麼理解ES6中 Decorator 的?使用場景?