定義
動態的給一個對象添加一些額外的功能。就添加功能來說,裝飾模式比繼承更靈活。
關鍵詞
靈活——裝飾模式比繼承要靈活得多。
動態、透明——外界不需要區分當前使用的是裝飾者還是被裝飾者。因爲兩者具有相同的接口。
撤銷——可以很方便地撤銷對某個對象的裝飾操作。
使用場景
1,在不影響其他對象的情況下,爲某一個單獨的對象添加功能。不能使用繼承,因爲繼承對所有的對象都產生作用。
2,處理可以撤銷的裝飾。只需要不使用裝飾類即可。
3,對某些無法繼承的類的對象添加額外操作。無法使用繼承的情況一般有兩種:第一類被final修飾;第二額外的功能太多,不可能爲每一種功能的組合都提供一個類,這會導致類的臃腫與膨脹。
比較
與繼承的比較
參見使用場景。
與策略模式的比較
1,裝飾模式影響對象的外表,而策略類影響的是對象的內在。裝飾類並不影響當前對象的核心邏輯,它只是在核心邏輯的前後添加一些額外的操作。但在策略時,是將對象的某一部分具體邏輯封裝給單獨的策略類,改變策略類就影響了對象內部的某些邏輯的實現方式。
2,裝飾類與被裝飾類必須具有相同的父類,而策略類可以有自己獨立的接口。前者是裝飾模式透明性的要求,後者是保證所有策略類能夠相互替換的要求。
3,當對象原來就很複雜時,使用策略模式比裝飾模式更適合。
與代理模式的比較
1,代理類與被代理類不一定具有相同的父類,裝飾模式卻要求一定要具有。
2,代理類是控制對被代理類的訪問,有可能並不能訪問到被代理類中;而裝飾模式卻是一定可以訪問到被裝飾的對象。
3,代理模式偏重於控制,而裝飾偏重於添加額外的功能。