代理模式
【代理模式】:為其他對象提供一種代理以控製對這個對象的訪問。
適用性:在需要用比較通用和複雜的對象指針代替簡單的指針的時候, 使用 Proxy 模式。下麵是一些可以使用 Proxy 模式常見情況:
1)遠程代理(Remote Proxy ) 為一個對象在不同的地址空間提供局部代表。 NEXTSTEP[Add94]使用 NXProxy 類實現了這一目的。 Coplien[Cop92] 稱這種代理為“大使”(Ambassador) 。
2)虛代理(Virtual Proxy )根據需要創建開銷很大的對象。在動機一節描述的 ImageProxy就是這樣一種代理的例子。
3)保護代理(Protection Proxy )控製對原始對象的訪問。 保護代理用於對象應該有不同 的訪問權限的時候。 例如, 在 Choices 操作係統[CIRM93]中 KemelProxies 為操作係統對象提供了訪問保護。
4)智能指引(Smart Reference )取代了簡單的指針,它在訪問對象時執行一些附加操作。 它的典型用途包括:
對指向實際對象的引用計數,這樣當該對象沒有引用時,可以自動釋放它(也稱為SmartPointers[Ede92]。
當第一次引用一個持久對象時,將它裝入內存。在訪問一個實際對象前,檢查是否已經鎖定了它, 以確保其他對象不能改變它。
結構:
示例代碼:
using System;
// Subject類,定義了RealSubject和Proxy的公共接口;
// 這樣在任何使用RealSubject的地方都可以使用Proxy
abstract class Subject
{
public abstract void Request();
}
class RealSubject : Subject
{
public override void Request()
{
Console.WriteLine("真實的請求");
}
}
//代理類:保存了一個引用,使得代理可以訪問實體,並提供一個與Subject的接口相同的接口;
class Proxy : Subject
{
RealSubject realSubject;//保存了一個引用.
public override void Request()
{
if (realSubject == null)
{
realSubject = new RealSubject();//實現代理功能
}
realSubject.Request();
}
}
//客戶代碼
class App
{
static void Main()
{
Proxy proxy = new Proxy();
proxy.Request();
Console.Read();
}
}
代碼實現
using System;
//共同實現的接口
interface GiveGift
{
void GiveDolls();
void GiveFlowers();
void GiveChocolate();
}
class SchoolGirl
{
public string name;
}
//追求者類
class Pursuit : GiveGift
{
SchoolGirl mm;
//用“要追求的人”來實例化“追求者”
public Pursuit(SchoolGirl mm)
{
this.mm = mm;
}
public void GiveDolls()
{
Console.WriteLine("送給"+mm.name+"洋娃娃");
}
public void GiveFlowers()
{
Console.WriteLine("送給" + mm.name + "鮮花");
}
public void GiveChocolate()
{
Console.WriteLine("送給" + mm.name + "巧克力");
}
}
//代理類
class Proxy : GiveGift
{
Pursuit gg;
public Proxy(SchoolGirl mm) //體現代理
{
gg = new Pursuit(mm);
}
//在實現方法中去調用“追求者”類的相關方法;
public void GiveDolls()
{
gg.GiveDolls();
}
public void GiveFlowers()
{
gg.GiveFlowers();
}
public void GiveChocolate()
{
gg.GiveChocolate();
}
}
//客戶代碼
class App
{
static void Main()
{
SchoolGirl jj = new SchoolGirl();
jj.name = "嬌嬌";
Proxy daili = new Proxy(jj);//代理跟女生打交道;
daili.GiveDolls();
daili.GiveFlowers();
daili.GiveChocolate();
Console.Read();
}
}
最後更新:2017-04-02 03:42:39