[Design Patterns]Proxy Pattern

代理模式,也稱為委任模式,屬於『結構型模式』。

目的

為其他物件提供一種代理,以控制對這個物件的訪問。

角色

抽象主題(Subject):具體科目和代理的共用接口。
真實主題(RealSubject):具體科目,定義Proxy的真實實體。
代理類別(Proxy):一個代理的實體,與Subject相通的接口,代理就可以替代實體。

優點

  • 一定程度上降低系統的耦合度。
  • 遠程代理的機器可能有更好的性能和處理速度,可以快速響應客戶端請求。
  • 虛擬代理用一個小對象代表一個大對象,減少資源消耗,提高運行速度。
  • 保護代理控制使用權限

缺點

  • 有些類型的代理,可能會造成請求的處理變慢。
  • 有些代理需要額外工作,有些實現非常複雜。

UML

UML

實際範例:送禮

  • 抽象主題(Subject):使用送禮介面
1
2
3
4
5
6
interface IGiveGift
{
void GiveDolls();
void GiveFlowers();
void GiveChocolate();
}
  • 真實主題(RealSubject):追求者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Pursuit : IGiveGift
{
SchoolGirl mm;

public Pursuit(SchoolGirl mm)
{
this.mm = mm;
}

public void GiveChocolate()
{
Console.WriteLine(mm.Name + " 送你巧克力");
}

public void GiveDolls()
{
Console.WriteLine(mm.Name + " 送你洋娃娃");
}

public void GiveFlowers()
{
Console.WriteLine(mm.Name + " 送你鮮花");
}
}
  • 代理類別(Proxy)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Proxy : IGiveGift
{
Pursuit gg;

public Proxy(SchoolGirl mm)
{
gg = new Pursuit(mm);
}

public void GiveChocolate()
{
gg.GiveChocolate();
}

public void GiveDolls()
{
gg.GiveDolls();
}

public void GiveFlowers()
{
gg.GiveFlowers();
}
}
  • 使用方式
1
2
3
4
5
6
7
8
9
10
SchoolGirl along = new SchoolGirl();
along.Name = "阿龍";

Proxy daili = new Proxy(along);

daili.GiveDolls();
daili.GiveFlowers();
daili.GiveChocolate();

Console.Read();
-------------The End-------------