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

 更新时间:2016年02月17日 17:43:31   作者:张龙豪  
这篇文章主要介绍了C#设计模式编程中的装饰者模式,同时也谈到了其在.NET框架中的应用,需要的朋友可以参考下

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

举例

汪峰打造冠军团队。

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

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

实现装配器模式的类图:

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);

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

相关文章

  • Winform窗体如何改变语言类型

    Winform窗体如何改变语言类型

    这篇文章主要介绍了Winform窗体如何改变语言类型,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-11-11
  • C#编程中使用ref和out关键字来传递数组对象的用法

    C#编程中使用ref和out关键字来传递数组对象的用法

    这篇文章主要介绍了C#编程中使用ref和out关键字来传递数组对象的用法,在C#中数组也是对象可以被传递,需要的朋友可以参考下
    2016-01-01
  • c#删除数组中符合条件的元素(正确写法)

    c#删除数组中符合条件的元素(正确写法)

    这篇文章主要介绍了c#删除数组中符合条件的元素,分别给大家展示了错误写法和正确写法,补充介绍了从C#的数组中删除指定元素的几种方法,需要的朋友可以参考下
    2023-10-10
  • Winform在DataGridView中显示图片

    Winform在DataGridView中显示图片

    本文主要介绍在DataGridView如何显示图片,简单实用,需要的朋友可以参考下。
    2016-05-05
  • WPF实现类似ChatGPT逐字打印效果的示例代码

    WPF实现类似ChatGPT逐字打印效果的示例代码

    前一段时间ChatGPT类的应用十分火爆,这类应用在回答用户的问题时逐字打印输出,像极了真人打字回复消息,本文就来利用WPF模拟一下这种逐字打印的效果吧
    2023-08-08
  • C#实现PDF合并的项目实践

    C#实现PDF合并的项目实践

    有时我们可能会遇到需要的资料或教程被分成了几部分存放在多个PDF文件中,本文主要介绍了C#实现PDF合并的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • C#根据反射和特性实现ORM映射实例分析

    C#根据反射和特性实现ORM映射实例分析

    这篇文章主要介绍了C#根据反射和特性实现ORM映射的方法,实例分析了反射的原理、特性与ORM的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C#的this关键字的2种用法

    C#的this关键字的2种用法

    这篇文章主要给大家分享的是C#的this关键字的2种用法,在使用C#的过程中,发现this关键是比较少用的,但是在下面这二个场合下是必须要使用的,不使用它是解决不了问题。下面我们就来看看文章的具体内容吧
    2021-10-10
  • c# 防火墙添加/删除 特定端口的示例

    c# 防火墙添加/删除 特定端口的示例

    这篇文章主要介绍了c# 如何将特定端口加入防火墙中,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-10-10
  • c# 组合模式

    c# 组合模式

    组合模式:将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。需求中式体现部分与整体层次的结构时,统一地使用组合对象中的所有对象时,应该考虑使用组合模式
    2012-10-10

最新评论