使用场景

  • 动态增加功能
    • 可以通过继承来实现,C#中也可以通过扩展方法实现
  • 需要动态地给一个对象增加功能,这些功能可以再动态地撤销
    • 可以通过继承来实现,但动态效果不明显
  • 需要增加由一些基本功能的排列组合而产生的非常大量的功能
    • 可以通过继承来实现,但需要大量子类
  • 某些功能有多次增加的可能性

    • 无法通过继承来实现

      优缺点

  • 装饰类应该分类集中管理,否则存在混乱的风险

    设计原理

    核心思想

    Q:动态的给对象增加功能、职责
    A:使用继承达到增加效果,通过对象组合优化继承效果

    实现步骤

    ①、装饰者和被装饰对象有相同的超类型。
    ②、你可以用一个或多个装饰者包装一个对象。
    ③、既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它。
    ④、装饰者可以在所委托被装饰者的行为之前与 / 或之后,加上自己的行为,以达到特定的目的。
    ⑤、对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。

    个人理解

    类图

    17163325-519d76e520154cd98326f55f9dbff8e8.png

    主要角色

  • 抽象构件(Phone)角色:给出一个抽象接口,以规范准备接受附加责任的对象。

  • 具体构件(AppPhone)角色:定义一个将要接收附加责任的类。
  • 装饰(Dicorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
  • 具体装饰(Sticker和Accessories)角色:负责给构件对象 ”贴上“附加的责任。

    代码实现

    核心代码

    1. //构件作为参数传入
    2. public MyDecorater(MaLaXiangGuo maLaXiangGuo)
    3. {
    4. mlxg = maLaXiangGuo;
    5. }
    6. //抽象方法迭代
    7. public new int Sum()
    8. {
    9. return mlxg.Sum()+base.Sum();
    10. }

    参考文档