1. 程式人生 > >註解與裝飾器

註解與裝飾器

對於很多 Java 開發人員來說,註解(Annotation)已經是一個十分熟悉的概念。而在 JavaScript 中(目前仍然是 Stage 2 的 ES Proposal),引入了一個類似的語法——裝飾器(Decorator)。
甚至有很多人在生活中不加區分兩個的概念,把裝飾器也叫做註解。那麼,裝飾器和註解到底有什麼聯絡與區別呢?

概念
註解(Annotation):僅提供附加元資料支援,並不能實現任何操作。需要另外的 Scanner 根據元資料執行相應操作。
裝飾器(Decorator):僅提供定義劫持,能夠對類及其方法的定義並沒有提供任何附加元資料的功能。
雖然語法上很相似,但在不同的語言中可能使用的是不同的概念:

使用註解(Annotation)的語言:AtScript、Java、C#(叫 Attribute)。
使用裝飾器(Decorator)的語言:Python、JavaScript/ECMAScript。
從概念上來說,我們可以很清晰的看出,註解和裝飾器在語義上沒有任何共性!

註解是給別人看的,影響別人的行為,而該行為並不僅僅由註解決定;裝飾器直接攔截,裝飾器就是行為改變的全部,裝飾器直接改變被裝飾物件的行為!

註解正如好人牌子一樣,影響別人對你看法;當你吃飯時,裝飾器就是那個幫你飯前收拾桌子,飯後擦桌子的人!

Java 中有裝飾器模式,但是這個是高度耦合的,AOP就是要去耦合,肯定不能再用Java的裝飾器模式了。 而Python的裝飾器模式確是解耦的。
在不用的語言,相同的名詞意思相反啊?Java裝飾器是為了增強類似功能,Python裝飾器是為了分離不同功能?

AOP是一種裝飾模式嗎?
問問題
投票
24
投票
最喜歡
7
我在接受採訪時被問到了這個問題。我清楚地知道裝飾器模式是什麼以及如何使用它。但我在採訪中無法思考這個問題。

這是實際問題。

AOP是裝飾模式的變體嗎?AOP實施與商標裝飾模式有何不同?

設計模式 語言不可知的 aop 裝飾
分享改善這個問題
於2011年11月13日14:11編輯

葉海亞
62.3k688120
11年11月13日14:09 問

Vinoth Kumar CM
45432371116
新增評論
4答案
活躍的 最老 票
投票
20
投票
接受
我會說AOP(面向方面​​程式設計)本身不是一個模式(因此不是我的POV中的一種裝飾模式)......它的實現可以通過一個或多個模式完成(包括使用裝飾模式)。 .. AOP是一種程式設計範例恕我直言 - 其他範例是例如OOP,函數語言程式設計或程式式程式設計......

分享改善這個答案
於11年11月13日14:16 回答

葉海亞
62.3k688120

AOP實現主要使用Proxy和Decorator的混合。 - BalusC 11年11月13日15:30
@BalusC:或程式碼編織。 - 史蒂文 2013年3月30日20:33
AOP的語義在語言層面執行:新增關鍵字,改變控制流等; 而Decorator完全在OOP的語義中執行(只是覆蓋虛擬方法)。這使得Decorator成為一種模式,而AOP則被認定為“語言擴充套件”。 - rwong 2014年 8月25日23:47
@rwong這取決於它實現的語言,例如,對於AspectJ,是的。對於更動態的語言,它可以只是一個庫。 - 戴夫牛頓 2015年5月19日17:59
新增評論
投票
10
投票
我同意Yahia的意見。請注意,雖然方面新增並可能修改現有功能,但它們通常應用於整個方法或類,而不是單個例項。

分享改善這個答案
於11年11月13日14:25 回答

盧塞羅
51.4k491142
1
+1用於突出顯示“整個方法/類與單個例項”點:-) - Yahia 11年11月13日在14:29
新增評論
投票
5
投票
我想在某種程度上說,是的,AOP是裝飾器模式的一個實現。

對我來說,最大的區別在於它的實施方式以及如何應用。

傳統裝飾器通常是物件,它們要麼顯式地組合要裝飾的物件,要麼由底層物件的擴充套件點啟用。

AOP通常以更“宣告”的方式指定 - 傳統的裝飾器是主線程式碼的一般部分。

傳統裝飾器通常僅適用於特定類或介面,並且通常在例項級別應用。AOP(通常)可以在“基礎級別”圍繞基本上任意的程式碼包裝功能 - 行為將擴充套件到應用方面的所有例項。這使它能夠滿足其“交叉功能”的要求:它不一定限於與裝飾者一樣狹窄的範圍。

這取決於基礎語言,但有些語言比其他語言更靈活。以上內容更多地適用於“靜態”語言(例如Java),而不是像Ruby這樣的語言,其中看起來像傳統裝飾器的東西可以應用於單個例項,或者成為類定義的一部分。

分享改善這個答案
於2011年11月13日14:35編輯
於11年11月13日14:29 回答

戴夫牛頓
138K18208253
新增評論
投票
1
投票
此外,支援跨部門關注攔截的依賴注入框架基本上應用了引擎蓋下的裝飾模式。將構造方法編織到中間語言中的框架(如在.Net MSIL中)不依賴於介面或繼承,這與裝飾器模式不同。