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

2019-12-30 12:50:53丽君

4. 模式总结

  4.1 优点

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

    4.1.2 类的核心职责与动态添加的职责是分离的。如果再向主类中添加新的功能,一是违反了开放封闭原则,二是增加了主类的复杂度。

    4.1.3 比静态继承更灵活 与对象的静态继承相比,Decorator模式提供了更加灵活的向对象添加职责的方式,可以使用添加和分离的方法,用装饰在运行时刻增加和删除职责.

  4.2 缺点

    4.2.1 产生许多小对象,采用Decorator模式进行系统设计往往会产生许多看上去类似的小对象,这些对象仅仅在他们相互连接的方式上有所不同。

  4.3 适用场景

    4.3.1 当需要为已有功能动态地添加更多功能时。

    4.3.2 类的核心功能无需改变,只是需要添加新的功能时。

5. 应用实例:装备大兵!无任何装备时(核心功能)可以用拳脚搏击;装备了步枪,可以正常射击;装备了重机枪,可以扫射;装备了火箭筒,可以防空。

  5.1 类图设计

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

  5.2 代码实现


 /// <summary>
 /// 装备类,相当于Component
 /// </summary>
 public abstract class Equipment
 {

  public abstract void Attack();
 }

 /// <summary>
 /// 士兵类,继承自Equipment
 /// </summary>
 public class Soldier : Equipment
 {
  public Soldier()
  {
   // 构造函数
  }

  /// <summary>
  /// 没有任何武器装备下的核心功能
  /// </summary>
  public override void Attack()
  {
   Console.WriteLine("用拳脚攻击!");
  }
 }

 public abstract class EquipDecorator : Equipment
 {
  protected Equipment equipment;

  /// <summary>
  /// 增加装备,使用该方法来动态地给士兵增加装备
  /// </summary>
  /// <param name="equipment"></param>
  public void SetComponent(Equipment equipment)
  {
   this.equipment = equipment;
  }

  /// <summary>
  /// 攻击
  /// </summary>
  public override void Attack()
  {
   //如果有装备,就用装备进行攻击
   if (equipment != null)
   {
    equipment.Attack();
   }
  }
 }

 /// <summary>
 /// 步枪
 /// </summary>
 public class RifleEquipment : EquipDecorator
 {
  public override void Attack()
  {
   base.Attack();

   Console.WriteLine("步枪射击,啪!");
  }
 }

 /// <summary>
 /// 机枪
 /// </summary>
 public class MachineGunEquipment : EquipDecorator
 {
  public override void Attack()
  {
   base.Attack();

   Console.WriteLine("机枪扫射,突突突!");
  }
 }

 /// <summary>
 /// 火箭筒
 /// </summary>
 public class RocketGunEquipment : EquipDecorator
 {
  public override void Attack()
  {
   base.Attack();

   Console.WriteLine("火箭炮射击,唰......!");
  }
 }