一起谈.NET技术,.Net Framework源代码中的模式之Decorator(装饰模式)

  动态地给一个对象添加一些额外的职责。就扩展功能而言,Decorator模式比生成子类方式更为灵活。

  以.NET Framework 2.0 System.IO中类为例。

 


System.IO.Stream

public abstract class Stream : MarshalByRefObject, IDisposable

{

  public abstract int Read([In, Out] byte[] buffer, int offset, int count);

  public abstract void Write(byte[] buffer, int offset, int count);

}

 

System.IO.MemoryStream

public class MemoryStream : Stream

{

  public MemoryStream(byte[] buffer)

  {

  }

  public override int Read([In, Out] byte[] buffer, int offset, int count)

  {

  }

  public override void Write(byte[] buffer, int offset, int count)

  {

  }

}

 

System.IO.FileStream

public class FileStream : Stream

{

  public FileStream(String path, FileMode mode)

  {

  }

  public override int Read([In, Out] byte[] buffer, int offset, int count)

  {

  }

  public override void Write(byte[] buffer, int offset, int count)

  {

  }

}

 

System.IO.BufferedStream

public class BufferedStream : Stream

{

  private Stream _s;

  public BufferedStream(Stream stream)

  {

  }

  public override int Read(byte[] buffer, int offset, int count)

  {

    _s.Read();

  }

  public override void Write(byte[] buffer, int offset, int count)

  {

     _s.Write();

  }

}

   调用代码

public class Client


{

   public static void Main()

  {

    FileStream stream =

new FileStream(@"c:\\C:\WINDOWS\system32\drivers\etc\services", FileMode.Open);

    BufferedStream bufferedStream = new BufferedStream(stream, 1024);

  }

}

  在.NET Framework中,所有的流操作都有一个共同的基类System.IO.Stream,它是一个抽象类,主要包含了Read、Write等行为。针对文件流和内存流的操作,定义了FileStream和MemoryStream类,都继承Stream类,分别实现不同的读写操作。为了提高流的读写性能,需要使用缓存Buffer来存放流数据。此时,Buffer的作用对于流的读写操作而言,就相当于一个装饰的作用。

  在以下情况下应当使用装饰模式:

  • 需要扩展一个类的功能,或给一个类增加附加责任。
  • 需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
  • 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。
时间: 2024-10-13 18:01:44

一起谈.NET技术,.Net Framework源代码中的模式之Decorator(装饰模式)的相关文章

.Net Framework源代码中的模式之Decorator(装饰模式)

动态地给一个对象添加一些额外的职责.就扩展功能而言,Decorator模式比生成子类方式更为灵活. 以.NET Framework 2.0 System.IO中类为例. System.IO.Streampublic abstract class Stream : MarshalByRefObject, IDisposable{ public abstract int Read([In, Out] byte[] buffer, int offset, int count); public abst

DotNet Framework源代码中的模式(一)——目录

DotNet Framework源代码中的模式(二)--前言 DotNet Framework源代码中的模式(三)--Iteartor(迭代器模式) DotNet Framework源代码中的模式(四)--Abstract Factory(抽象工厂模式) DotNet Framework源代码中的模式(五)--Decorator(装饰模式) DotNet Framework源代码中的模式(六)--Prototype(原型模式) DotNet Framework源代码中的模式(七)--Factor

一起谈.NET技术,.Net Framework源代码中的模式之Prototype(原型模式)

用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. 以.NET Framework 2.0 System.Collections中类为例. System.Collections. ICollection public interface ICollection : IEnumerable{} System.Collections. ICloneable  public interface ICloneable{ object Clone();} System.Collection

DotNet Framework源代码中的模式(二)——前言

随着Visual Studio 2008的发布,微软根据MS-RL协议向开发人员提供了.NET Framework的源代码,包括基础类库 (BCL). ASP.NET. WinForms和WPF等代码..NET Framework是.NET平台的基础架构,它的开放源代码,为开发人员更加深入研究.NET 技术细节提供了极大便利,也为开发人员如何构建一个优秀的软件开发框架提供了很好借鉴. 构建一个优秀的软件开发框架,必然会使用设计模式..NET Framework作为一个优秀的软件开发框架,设计模式

.Net Framework源代码中的模式前言

随着Visual Studio 2008的发布,微软根据MS-RL协议向开发人员提供了.NET Framework的源代码,包括基础类库 (BCL). ASP.NET. WinForms和WPF等代码..NET Framework是.NET平台的基础架构,都开放源代码,为开发人员更加深入研究.NET 技术细节提供了极大便利,也为开发人员如何构建一个优秀的软件开发框架提供了很好借鉴. 构建一个优秀的软件开发框架,必然会使用设计模式..NET Framework作为一个优秀的软件开发框架,设计模式无

DotNet Framework源代码中的模式(九)——Flyweight(享元模式)

运用共享技术有效地支持大量细粒度的对象. 在.Net中处理字符串时,有一个很重要的机制,叫做字符串驻留机制,就是运用了享元模式.CLR(公共语言运行库)通过维护一个表来存放字符串,该表称为拘留池,它包含程序中以编程方式声明或创建的每个唯一的字符串的一个引用.因此,具有特定值的字符串的实例在系统中只有一个. CLR中使用享元模式实现字符串驻留的过程:CLR内部维护着一块特殊的数据结构--我们可以把它看成是一个Hash table,这个Hash table维护者大部分创建的string(我这里没有说

DotNet Framework源代码中的模式(八)——Builder(生成器模式)

将一个复杂对象的构件与它的表示分离,使得同样的构建过程可以创建不同的表述. 建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造.一般而言,此接口独立于应用程序的商业逻辑.模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色.具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法. 具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例.这个角色主要完

DotNet Framework源代码中的模式(三)——Iteartor(迭代器模式)

提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 以.NET Framework 2.0 System.Collections中类为例 System.Collections. IEnumerable public interface IEnumerable { IEnumerator GetEnumerator(); } System.Collections.ICollection public interface ICollection : IEnumerable {

.Net Framework源代码中的模式之Prototype(原型模式)

用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. 以.NET Framework 2.0 System.Collections中类为例. System.Collections. ICollection public interface ICollection : IEnumerable { } System.Collections. ICloneable public interface ICloneable { object Clone(); } System.Collect