解析C#设计模式编程中的装饰者模式

所属分类: 软件编程 / C#教程 阅读数: 52
收藏 0 赞 0 分享

装饰者模式定义:不通过派生类增改类属性动作,而是通过模式设计动态的达到这种效果,而且比继承更方便灵活减少程序的复杂性。

举例

汪峰打造冠军团队。

首先团队类为空,经过汪峰不断的努力,为团队争取学员,也为团队队员打造合适的平台,让其发挥。

团队不断的变强,变完整,是由装饰者,根据不同的需求,给基类进行增改,一致最后赢得你的赞同,满足你的需求。

实现装配器模式的类图:

2016217174042765.png (656×437)

战队组建代码

 //汪峰战队
  abstract class WangFengTeam
  {
    //执行策划命令
    abstract public void Acrion();
  }

  //学员
  class Student : WangFengTeam
  {
    // Methods
    override public void Acrion()
    {
      Console.WriteLine("汪峰团队学员情况:");
    }
  }

  // 战队总策划
  abstract class Direct : WangFengTeam
  {
    //汪峰战队
    protected WangFengTeam team;

    // 策划活动
    public void SetComponent(WangFengTeam team)
    {
      this.team = team;
    }
    //执行策划
    override public void Acrion()
    {
      if (team != null)
      {
        team.Acrion();
      }
    }
  }

  //男孩唱狂放型的,构建一个组合。
  class BoyTeam : Direct
  {
    // 组合名称
    public string teamName= "锋利的Jquery";

    //具体策划
    override public void Acrion()
    {
      base.Acrion();
      Console.WriteLine("我是汪峰团队,狂放型的。");
    }
  }

  //女孩唱婉约型的,来个模特表演
  class GrilTeam : Direct
  {
    //具体策划
    override public void Acrion()
    {
      base.Acrion();      

      Console.WriteLine("我是汪峰团队,婉约型的。");

      //模特表演
      show();
    }

    public void show()
    {
      Console.WriteLine("婉约型,走秀");
    }
  }

客户端代码:

 public static void Main()
    {
      Student team = new Student();
      BoyTeam boy = new BoyTeam();
      GrilTeam girl = new GrilTeam();

      //团队男孩装饰
      boy.SetComponent(team);
      //团队女孩装饰
      girl.SetComponent(boy);
      girl.Acrion();
      Console.Read();
    }


装饰者模式的优缺点
看完装饰者模式的详细介绍之后,我们继续分析下它的优缺点。

优点:

  • 装饰这模式和继承的目的都是扩展对象的功能,但装饰者模式比继承更灵活
  • 通过使用不同的具体装饰类以及这些类的排列组合,设计师可以创造出很多不同行为的组合
  • 装饰者模式有很好地可扩展性

缺点:

装饰者模式会导致设计中出现许多小对象,如果过度使用,会让程序变的更复杂。并且更多的对象会是的差错变得困难,特别是这些对象看上去都很像。

使用场景
下面让我们看看装饰者模式具体在哪些情况下使用,在以下情况下应当使用装饰者模式:
需要扩展一个类的功能或给一个类增加附加责任。
需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
需要增加由一些基本功能的排列组合而产生的非常大量的功能


.NET中装饰者模式的实现
在.NET 类库中也有装饰者模式的实现,该类就是System.IO.Stream,下面看看Stream类结构:

2016217174213251.png (562×255)

BufferedStream、CryptoStream和GZipStream其实就是两个具体装饰类,这里的装饰者模式省略了抽象装饰角色(Decorator)。下面演示下客户端如何动态地为MemoryStream动态增加功能的。

MemoryStream memoryStream = new MemoryStream(new byte[] {95,96,97,98,99});
      // 扩展缓冲的功能
      BufferedStream buffStream = new BufferedStream(memoryStream);
      // 添加加密的功能
      CryptoStream cryptoStream = new CryptoStream(memoryStream,new AesManaged().CreateEncryptor(),CryptoStreamMode.Write);
      // 添加压缩功能
      GZipStream gzipStream = new GZipStream(memoryStream, CompressionMode.Compress, true);

总结
到这里,装饰者模式的介绍就结束了,装饰者模式采用对象组合而非继承的方式实现了再运行时动态地扩展对象功能的能力,而且可以根据需要扩展多个功能,避免了单独使用继承带来的 ”灵活性差“和”多子类衍生问题“。同时它很好地符合面向对象设计原则中 ”优先使用对象组合而非继承“和”开放-封闭“原则。

更多精彩内容其他人还在看

C# SendInput 模拟鼠标操作的实现方法

C# SendInput 模拟鼠标操作的实现方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

C#中 paint()与Onpaint()的区别

paint是事件onpaint方法onpaint方法是调用paint事件的,用哪一个,效果是一样,就看那一个方便了内部是这样实现的:
收藏 0 赞 0 分享

c#中GetType()与Typeof()的区别

c#中GetType()与Typeof()的区别,需要的朋友可以参考一下
收藏 0 赞 0 分享

将字符串转换成System.Drawing.Color类型的方法

将字符串转换成System.Drawing.Color类型的方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

C# 抓取网页内容的方法

C# 抓取网页内容的方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

基于C#后台调用跨域MVC服务及带Cookie验证的实现

本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下
收藏 0 赞 0 分享

使用C#获取远程图片 Form用户名与密码Authorization认证的实现

本篇文章介绍了,使用C#获取远程图片 Form用户名与密码Authorization认证的实现。需要的朋友参考下
收藏 0 赞 0 分享

Winform跨线程操作的简单方法

线程间操作无效:从不是创建控件“label1”的线程访问它
收藏 0 赞 0 分享

C# WINFORM 强制让窗体获得焦点的方法代码

C# WINFORM 强制让窗体获得焦点的方法代码,需要的朋友可以参考一下
收藏 0 赞 0 分享

C#中方括号[]的语法及作用介绍

C#中方括号[]可用于数组,索引、属性,更重要的是用于外部DLL类库的引用。
收藏 0 赞 0 分享
查看更多