.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 abstract void Write(byte[] buffer, int offset, int count);} System.IO.MemoryStreampublic 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.FileStreampublic 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.BufferedStreampublic 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-06 19:01:16

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

一起谈.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

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

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

DotNet Framework源代码中的模式(五)——Decorator(装饰模式)

动态地给一个对象添加一些额外的职责.就扩展功能而言,Decorator模式比生成子类方式更为灵活. 以.NET Framework 2.0 System.IO中类为例

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源代码中的模式(八)——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

.Net Framework源代码中的模式之Abstract Factory(抽象工厂模式)

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 以.NET Framework 2.0 System.Data中类为例. 通过使用DbProviderFactory,只需要修改配置文件,就可以实现不同数据库访问的目的. System.Data.Common.DbProviderFactory public abstract class DbProviderFactory {   public virtual DbConnection CreateConnection() {