動機:在物件導向系統中,有些對象由於某種原因(比如對象建立的開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問等),直接存取會給使用者或者系統結構帶來很多麻煩。如何在不失去透明操作對象的同時來管理/控制這些對象特有的複雜性?增加一層間接層是軟體開發中常見的解決方式。
應用:遠程對象訪問、Copy-On-Write
情境:為了使操作ThinkPad對應用程式透明,隔離硬體操作的複雜性,在應用程式和ThinkPad中間置入一代理層(相當於作業系統),此代理通過嚮應用程式提供一致的API,實現對硬體的操作。
結構
代碼實現
namespace DesignPattern.Proxy
{
public interface IThinkPad
{
void Start();
void Operate();
void Shutdown();
}
/**//// <summary>
/// 實體,實現ThinkPad操作
/// </summary>
public class ThinkPad : IThinkPad
{
public void Start()
{
}
public void Operate()
{
}
public void Shutdown()
{
}
}
/**//// <summary>
/// 代理,能供應用程式調用,實現對ThinkPad的操作
/// </summary>
public class ThinkPadProxy : IThinkPad
{
IThinkPad thinkPad;
public ThinkPadProxy(IThinkPad thinkPad)
{
this.thinkPad = thinkPad;
}
public void Start()
{
// .
thinkPad.Start();
// .
}
public void Operate()
{
// .
thinkPad.Operate();
// .
}
public void Shutdown()
{
// .
thinkPad.Shutdown();
// .
}
}
}
namespace DesignPattern.Proxy
{
public class Application
{
IThinkPad thinkPad = new ThinkPadProxy(new ThinkPad());
public void StartThinkPad()
{
thinkPad.Start();
}
public void OperateThinkPad()
{
thinkPad.Operate();
}
public void ShutdownThinkPad()
{
thinkPad.Shutdown();
}
}
}
要點:
1、在物件導向系統中,直接使用某些對象會帶來帶很多問題,作為間接層的代理對象是解決這一問題的常用手段。
2、該模式在具體使用的時候,實現方法、粒度都相差很大。有些可能對單個對象做細粒度的控制,如Copy-On-Write技術,有些可能對組件模組提供抽象代理層,在架構層次對對象做代理。
3、該模式並不要求保持介面一致,只要能夠實現間接控制,有時損失一些透明性是可以接受的。