C# 设计模式系列教程-装饰模式

2019-12-30 12:50:53丽君
每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。它是由Decorator的SetComponent方法来实现的,因而它们的职责是单一的。  

1. 概述

  动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。

  原理:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口。

2. 模式中的角色

  2.1 抽象构建(Component):定义一个抽象接口,用以给这些对象动态地添加职责。

  2.2 具体构建(ConcreteComponent):定义一个具体的对象,也可以给这个对象添加一些职责。

  2.3 装饰类(Decorator): 装饰抽象类,继承了Component,从外类来扩展Component类的功能。

  2.4 具体装饰者(ConcretorDecorator):负责给构建对象添加职责。

3. 模式解读

  3.1 装饰模式的一般化类图

C#,设计模式,装饰模式

  3.2 装饰模式的一般化代码


 /// <summary>
 /// 定义一个对象接口,可以给这些对象动态地添加职责
 /// </summary>
 public abstract class Component
 {
  public abstract void Opration();
 }

 /// <summary>
 /// 具体对象
 /// </summary>
 public class ConcreteComponent:Component
 {

  public override void Opration()
  {
   // 具体对象的操作
  }
 }

 /// <summary>
 /// 抽象的装饰类,它不能初始化对象。
 /// </summary>
 public abstract class Decorator:Component
 {
  protected Component component;

  /// <summary>
  /// 设置Component
  /// </summary>
  /// <param name="component"></param>
  public void SetComponent(Component component)
  {
   this.component = component;
  }

  /// <summary>
  /// 重写Operation,实际执行的是Component的Operation。
  /// </summary>
  public override void Opration()
  {
   if (component != null)
   {
    component.Opration();
   }
  }
 }

 public class ConcreteDecoratorA : Decorator
 {
  private void SpecialOpration()
  {
   // 本类特有的功能
  }

  public override void Opration()
  {
   //首先运行原Component的Operation(),在执行本类的功能,相当于对原Component进行了装饰
   base.Opration();

   this.SpecialOpration();
  }
 }

 public class ConcreteDecoratorB : Decorator
 {
  private void SpecialOprationA()
  {
   // 本类特有的功能 A
  }

  private void SpecialOprationB()
  {
   // 本类特有的功能 B
  }

  public override void Opration()
  {
   //首先运行原Component的Operation(),在执行本类的功能,相当于对原Component进行了装饰
   base.Opration();

   this.SpecialOprationA();
   this.SpecialOprationB();
  }
 }