爲其餘對象提供一種代理以控制對這個對象的訪問。(在訪問真實對象時,引入必定程度的間接性,由於這種間接性能夠附加多種用途)【結構型模式】安全
1.結構類圖的實現:ui
ISubject類,定義了RealSubject和Proxy的公用接口。在任何使用RealSubject的地方均可以使用Proxy。this
RealSubject類,定義Proxy所表明的真實實體。spa
Proxy類,保存一個引用使得代理能夠訪問實體,並提供一個與ISubject的接口相同的接口,這樣代理就能夠用來代替實體。3d
/// <summary> /// 主題 /// </summary> public interface ISubject { void Request(); } /// <summary> /// 真實主題 /// </summary> public class RealSubject : ISubject { public void Request() { Console.WriteLine("真實的請求"); } } /// <summary> /// 代理類 /// </summary> public class Proxy : ISubject { RealSubject real; public void Request() { if (real == null) real = new RealSubject(); real.Request(); } }
客戶端代理
Proxy proxy = new Proxy(); proxy.Request();
結果code
2.代理模式之撩妹對象
撩妹的最高境界就是,不用本身親自出馬,找個代理人送花,送巧克力就行。撩妹就是【Subject】,追求者就是【RealSubject】,代理人就是【Proxy】了。blog
美女和撩妹技巧接口
/// <summary> /// 美女 /// </summary> public class Beauty { public string Name; public Beauty(string name) { Name = name; } } /// <summary> /// 撩妹技巧 /// </summary> public interface IChaseGirl { /// <summary> /// 送花 /// </summary> void GiveFlowers(); /// <summary> /// 送巧克力 /// </summary> void GiveChocolate(); }
追求者和代理人
/// <summary> /// 追求者 /// </summary> public class Pursuit : IChaseGirl { private Beauty mm; public Pursuit(Beauty mm) { this.mm = mm; } public void GiveChocolate() { Console.WriteLine("送給{0}的巧克力~", mm.Name); } public void GiveFlowers() { Console.WriteLine("送給{0}的花~", mm.Name); } } /// <summary> /// 代理者 /// </summary> public class Proxy: IChaseGirl { /// <summary> /// 真實追求者 /// </summary> private Pursuit pursuit; public Proxy(Beauty mm) { pursuit = new Pursuit(mm); } public void GiveChocolate() { pursuit.GiveChocolate(); } public void GiveFlowers() { pursuit.GiveFlowers(); } }
客戶端
Beauty mm = new Beauty("紫霞仙子"); Proxy proxy = new Proxy(mm); proxy.GiveChocolate(); proxy.GiveFlowers();
結果
話說紫霞仙子最後愛上了誰呢?追求者仍是代理者?固然代理者啦,東西雖然真實的送出者是追求者,但整個過程當中他的面都沒有露過啊。
撩妹都要用代理模式,這難道就是程序猿單身的緣由?
請多多指教~