代理模式
里氏替換原則:子類型必須能夠替換掉他們的父類型。
核心
為其他對象提供一種代理,以控制對這個對象的訪問。
好處
在直接訪問對象時帶來的問題,比如說:要訪問的對象在遠程的機器上。在面向對象系統中,有些對象由于某些原因(比如對象創建開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問),直接訪問會給使用者或者系統結構帶來很多麻煩,我們可以在訪問此對象時加上一個對此對象的訪問層。
例子
情景是:A追求李嬌嬌,但不認識,通過認識她的B來送禮物。B是代理,代替A完成送禮物的事情。(實現送禮物接口)
UML圖
//被追求者類
class SchoolGirl
{
public string Name { get; set; }
}
//代理接口(送禮物)
interface GiveGift
{
void GiveDolls();
void GiveFlowers();
void GiveChocolate();
}
//追求者類
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
{
private 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 Program
{
static void Main(string[] args)
{
SchoolGirl jiaojiao = new SchoolGirl();
jiaojiao.Name = "李嬌嬌";
Proxy daili = new Proxy(jiaojiao);
daili.GiveDolls();
daili.GiveFlowers();
daili.GiveChocolate();
Console.Read();
}
}
例子來源:Linux公社《大話設計模式》
實例代碼在我的代碼托管上
代理模式