使用场景
- 动态增加功能
- 可以通过继承来实现,C#中也可以通过扩展方法实现
- 需要动态地给一个对象增加功能,这些功能可以再动态地撤销
- 可以通过继承来实现,但动态效果不明显
- 需要增加由一些基本功能的排列组合而产生的非常大量的功能
- 可以通过继承来实现,但需要大量子类
某些功能有多次增加的可能性
-
设计原理
核心思想
Q:动态的给对象增加功能、职责A:使用继承达到增加效果,通过对象组合优化继承效果实现步骤
①、装饰者和被装饰对象有相同的超类型。
②、你可以用一个或多个装饰者包装一个对象。
③、既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它。
④、装饰者可以在所委托被装饰者的行为之前与 / 或之后,加上自己的行为,以达到特定的目的。
⑤、对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。个人理解
类图
主要角色
抽象构件(Phone)角色:给出一个抽象接口,以规范准备接受附加责任的对象。
- 具体构件(AppPhone)角色:定义一个将要接收附加责任的类。
- 装饰(Dicorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
- 具体装饰(Sticker和Accessories)角色:负责给构件对象 ”贴上“附加的责任。
代码实现
核心代码
//构件作为参数传入public MyDecorater(MaLaXiangGuo maLaXiangGuo){mlxg = maLaXiangGuo;}//抽象方法迭代public new int Sum(){return mlxg.Sum()+base.Sum();}
参考文档
