六、使用裝飾模式的優點和缺點
使用裝飾模式主要有以下的優點:
裝飾模式與繼承關系的目的都是要擴展對象的功能,但是裝飾模式可以提供比繼承更多的靈活性。
通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。
這種比繼承更加靈活機動的特性,也同時意味著裝飾模式比繼承更加易於出錯。
使用裝飾模式主要有以下的缺點:
由於使用裝飾模式,可以比使用繼承關系需要較少數目的類。使用較少的類,當然使設計比較易於進行。但是,在另一方面,使用裝飾模式會產生比使用繼承關系更多的對象。更多的對象會使得查錯變得困難,特別是這些對象看上去都很相像。
七、模式實現的討論
大多數情況下,裝飾模式的實現都比上面定義中給出的示意性實現要簡單。對模式進行簡化時需要注意以下的情況:
(1)一個裝飾類的接口必須與被裝飾類的接口相容。
(2)盡量保持Component作為一個"輕"類,不要把太多的邏輯和狀態放在Component類裡。
(3)如果只有一個ConcreteComponent類而沒有抽象的Component類(接口),那麼Decorator類經常可以是ConcreteComponent的一個子類。如下圖所示:
(4)如果只有一個ConcreteDecorator類,那麼就沒有必要建立一個單獨的Decorator類,而可以把Decorator和ConcreteDecorator的責任合並成一個類。