索引
动态地给一个对象添加一些额外的职责。
就增加功能来说,Decorator 模式相比生成子类更为灵活。
Attach additional responsibilities to an object dynamically.
Decorators provide a flexible alternative to subclassing for extending functionality.
Component
ConcreteComponent
Decorator
ConcreteDecorator
在以下情况下可以使用 Decorator 模式:
实现方式(一):Decorator 对象的接口必须与它所装饰的 Component 的接口保持一致。
所有的 ConcreteDecorator 类必须有一个公共的父类。
使用 Decorator 模式仅从外部改变组件,因此组件无需对它的装饰有任何了解,也就是说,这些装饰对该组件是透明的。
1 namespace DecoratorPattern.Implementation1 2 { 3 public abstract class Component 4 { 5 public abstract void Operation(); 6 } 7 8 public class ConcreteComponent : Component 9 { 10 public override void Operation() 11 { 12 // do something 13 } 14 } 15 16 public abstract class Decorator : Component 17 { 18 private Component _component; 19 20 public Decorator(Component component) 21 { 22 _component = component; 23 } 24 25 public override void Operation() 26 { 27 _component.Operation(); 28 } 29 } 30 31 public class ConcreteDecorator : Decorator 32 { 33 public ConcreteDecorator(Component component) 34 : base(component) 35 { 36 } 37 38 public override void Operation() 39 { 40 base.Operation(); 41 AddedBehavior(); 42 } 43 44 private void AddedBehavior() 45 { 46 // do some other things 47 } 48 } 49 50 public class Client 51 { 52 public void TestCase1() 53 { 54 Component component1 = new ConcreteComponent(); 55 Component component2 = new ConcreteDecorator(component1); 56 57 component2.Operation(); 58 } 59 } 60 }
当仅需要添加一个职责是,没有必要定义抽象的 Decorator 类。
这时可以把 Decorator 向 Component 转发请求的职责合并到 ConcreteDecorator 中。
1 namespace DecoratorPattern.Implementation2 2 { 3 public abstract class Component 4 { 5 public abstract void Operation(); 6 } 7 8 public class ConcreteComponent : Component 9 { 10 public override void Operation() 11 { 12 // do something 13 } 14 } 15 16 public class ConcreteDecorator : Component 17 { 18 private Component _component; 19 20 public ConcreteDecorator(Component component) 21 { 22 _component = component; 23 } 24 25 public override void Operation() 26 { 27 _component.Operation(); 28 AddedBehavior(); 29 } 30 31 private void AddedBehavior() 32 { 33 // do some other things 34 } 35 } 36 37 public class Client 38 { 39 public void TestCase1() 40 { 41 Component component1 = new ConcreteComponent(); 42 Component component2 = new ConcreteDecorator(component1); 43 44 component2.Operation(); 45 } 46 } 47 }
设计模式之美:Decorator(装饰),布布扣,bubuko.com
原文:http://www.cnblogs.com/gaochundong/p/design_pattern_decorator.html