對於這兩個十分接近的設計模式,確實容易產生困惑,代理模式和裝飾器模式看起來十分相似,都是由兩個類實現相同的介面,然後一個類套另一個類。這件事足足困擾了我5分鐘之久,在此總結一下它們的差別。 ## 目的不同 當你想要增強你的類,給你的類增加新功能的話,你就該使用裝飾器模式了。 裝飾器模式由於添加了功能 ...
對於這兩個十分接近的設計模式,確實容易產生困惑,代理模式和裝飾器模式看起來十分相似,都是由兩個類實現相同的介面,然後一個類套另一個類。這件事足足困擾了我5分鐘之久,在此總結一下它們的差別。
目的不同
當你想要增強你的類,給你的類增加新功能的話,你就該使用裝飾器模式了。
裝飾器模式由於添加了功能,通常會增加性能開銷。
而當你想要儘可能的少去調用你的類的話,請使用代理模式。另外,日誌之類的功能也建議寫在代理模式中。
代理模式會儘可能的將耗費性能的操作留到需要時再使用。不會降低性能開銷,但會將卡頓延後或集中。
用法不同
裝飾器模式由外部調用,可以自由選擇是否使用裝飾器,new C(new B(new A()))
和 new C(new A())
都是可行的(A 為被裝飾類)。
代理模式為內部調用,由代理模式內部調用被代理對象。單獨的被代理對象很可能功能不全,甚至根本就無法被外部創建,外部調用通常也是直接調用代理。