你的位置:首页 > 软件开发 > ASP.net > 设计模式(九)装饰者模式(Decorator Pattern)

设计模式(九)装饰者模式(Decorator Pattern)

发布时间:2016-03-28 11:00:13
一、引言  在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类)、AccessoriesPhone(挂件手机类)等,这样就会导致 &rdq ...

设计模式(九)装饰者模式(Decorator Pattern)

一、引言

  在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类)、AccessoriesPhone(挂件手机类)等,这样就会导致 ”子类**“问题,为了解决这个问题,我们可以使用装饰者模式来动态地给一个对象添加额外的职责。下面让我们看看装饰者模式。

二、装饰者模式的详细介绍

2.1 定义

  装饰者模式以对客户透明的方式动态地给一个对象附加上更多的责任,装饰者模式相比生成子类可以更灵活地增加功能。

2.2 装饰者模式实现

这里以手机和手机配件的例子来演示装饰者模式的实现,具体代码如下:

  /// <summary>  /// 手机抽象类,即装饰者模式中的抽象组件类  /// </summary>  public abstract class Phone  {    public abstract void Print();  }  /// <summary>  /// 苹果手机,即装饰着模式中的具体组件类  /// </summary>  public class ApplePhone:Phone  {    /// <summary>    /// 重写基类方法    /// </summary>    public override void Print()    {      Console.WriteLine("开始执行具体的对象——苹果手机");    }  }  /// <summary>  /// 装饰抽象类,要让装饰完全取代抽象组件,所以必须继承自Photo  /// </summary>  public abstract class Decorator:Phone  {    private Phone phone;    public Decorator(Phone p)    {      this.phone = p;    }    public override void Print()    {      if (phone != null)      {        phone.Print();      }    }  }  /// <summary>  /// 贴膜,即具体装饰者  /// </summary>  public class Sticker : Decorator  {    public Sticker(Phone p)      : base(p)    {    }    public override void Print()    {      base.Print();      // 添加新的行为      AddSticker();      }    /// <summary>    /// 新的行为方法    /// </summary>    public void AddSticker()    {      Console.WriteLine("现在苹果手机有贴膜了");    }  }  /// <summary>  /// 手机挂件  /// </summary>  public class Accessories : Decorator  {    public Accessories(Phone p)      : base(p)    {    }    public override void Print()    {      base.Print();      // 添加新的行为      AddAccessories();        }    /// <summary>    /// 新的行为方法    /// </summary>    public void AddAccessories()    {      Console.WriteLine("现在苹果手机有漂亮的挂件了");    }  }

原标题:设计模式(九)装饰者模式(Decorator Pattern)

关键词:设计模式

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。