为其余对象提供一种代理以控制对这个对象的访问。(在访问真实对象时,引入必定程度的间接性,由于这种间接性能够附加多种用途)【结构型模式】安全
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();
结果
话说紫霞仙子最后爱上了谁呢?追求者仍是代理者?固然代理者啦,东西虽然真实的送出者是追求者,但整个过程当中他的面都没有露过啊。
撩妹都要用代理模式,这难道就是程序猿单身的缘由?
请多多指教~