.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的作用對于流的讀寫操作而言,就相當于一個裝飾的作用。
在以下情況下應當使用裝飾模式:
- 需要擴展一個類的功能,或給一個類增加附加責任。
- 需要動態地給一個對象增加功能,這些功能可以再動態地撤銷。
- 需要增加由一些基本功能的排列組合而產生的非常大量的功能,從而使繼承關系變得不現實。
全站熱搜
留言列表