代理模式的應用:
遠程代理,為一個對象在不同的地址空間提供局部代表,可以隱藏一個對象存在于不同地質空間的事實。
虛擬代理,根據需要創建開銷很大的對象,通過代理來存放實例化需要很長時間的真實對象。
安全代理,用來控制真實對象的訪問權限。
智能代理,當調用代理時,可以代理處理一些額外的功能。
案例場景:
向一位自己心儀的女孩表達愛意,一般我們有兩種選擇:親自出馬(有自信的人)和 使用‘媒婆'(比較害羞)。
其中使用‘媒婆'就是代理行為,我們實現如下:
調用代理模式的主函數:
class Program { static void Main(string[] args) { SchoolGirl jiaojiao = new SchoolGirl(); jiaojiao.Name = "李嬌嬌"; //親自出馬 IGiveGift self = new Pursuit(jiaojiao); self.GiveChocolate();//送巧克力 self.GiveDolls();//送洋娃娃 self.GiveFlowers();//送鮮花 //使用‘媒婆' IGiveGift daili = new Proxy(jiaojiao); daili.GiveChocolate();//送巧克力 daili.GiveDolls();//送洋娃娃 daili.GiveFlowers();//送鮮花 Console.ReadKey(); } }
SchoolGirl類是代表女孩對象,實現如下:
public class SchoolGirl { private string name; public string Name { get; set; } }
Pursuit類是代表一個真實的事物(追求女孩的追求者),實現如下:
public class Pursuit : IGiveGift { 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 + "送你巧克力"); } }
Proxy類是Pursuit類的代表,實現如下:
public class Proxy : IGiveGift { Pursuit gg; public Proxy(SchoolGirl mm) { this.gg = new Pursuit(mm); } public void GiveDolls() { gg.GiveDolls(); } public void GiveFlowers() { gg.GiveFlowers(); } public void GiveChocolate() { gg.GiveChocolate(); } }
Pursuit類和Proxy類都繼承IGiveGift接口,實現如下:
interface IGiveGift { void GiveDolls(); void GiveFlowers(); void GiveChocolate(); }
我們看一張代理模式的結構圖:
新聞熱點
疑難解答