代理模式
里氏替換原則:子類型必須能夠替換掉他們的父類型肛响。
核心
為其他對(duì)象提供一種代理,以控制對(duì)這個(gè)對(duì)象的訪問嘿悬。
好處
在直接訪問對(duì)象時(shí)帶來的問題副硅,比如說:要訪問的對(duì)象在遠(yuǎn)程的機(jī)器上。在面向?qū)ο笙到y(tǒng)中爸业,有些對(duì)象由于某些原因(比如對(duì)象創(chuàng)建開銷很大其骄,或者某些操作需要安全控制,或者需要進(jìn)程外的訪問)扯旷,直接訪問會(huì)給使用者或者系統(tǒng)結(jié)構(gòu)帶來很多麻煩拯爽,我們可以在訪問此對(duì)象時(shí)加上一個(gè)對(duì)此對(duì)象的訪問層。
例子
情景是:A追求李嬌嬌钧忽,但不認(rèn)識(shí)毯炮,通過認(rèn)識(shí)她的B來送禮物逼肯。B是代理,代替A完成送禮物的事情桃煎。(實(shí)現(xiàn)送禮物接口)
//被追求者類
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公社《大話設(shè)計(jì)模式》
實(shí)例代碼在我的代碼托管上
代理模式