1.引入
很多情况下,我们无法直接使用某个对象,需要经过一个“中间人”达到目的,该过程即使用了称为代理模式。例如,外网访问需要代理服务器,外国产品需要代购、中介、第三方售票等。使用代理模式能够间接访问到目标对象,具有职责清晰、高扩展性和保护目标对象等优势。
2. 代理模式的定义
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
3. 场景模拟
场景引入: 戴笠帮贾卓义给娇娇送花、送巧克力、送礼物,最终娇娇和戴笠在一起。
3.1 没有代理的实现
代码实现:
class SchoolGirl { private string name; public string Name { get { return name; } set { name = value; } } } class pursuite { SchoolGirl mm; public pursuite(SchoolGirl mm) { this.mm = mm; } public void GiveDolls() { Console.WriteLine(mm.Name+"give you dolls"); } public void GiveFlowers() { Console.WriteLine(mm.Name + "give you flower"); } public void GiveChocolate() { Console.WriteLine(mm.Name + "give you chocolate"); } } class Program { static void Main(string[] args) { SchoolGirl mm = new SchoolGirl(); mm.Name = "娇娇"; pursuite ps = new pursuite(mm); ps.GiveChocolate(); ps.GiveDolls(); ps.GiveFlowers(); Console.WriteLine("Hello World!"); } }
3.2 只有代理的实现
只有代理的实现中,类结构图如下图所示:
代码实现:
class SchoolGirl { private string name; public string Name { get { return name; } set { name = value; } } } class Proxy { SchoolGirl mm; public Proxy(SchoolGirl mm) { this.mm = mm; } public void GiveDolls() { Console.WriteLine(mm.Name + "give you dolls"); } public void GiveFlowers() { Console.WriteLine(mm.Name + "give you flower"); } public void GiveChocolate() { Console.WriteLine(mm.Name + "give you chocolate"); } } static void Main(string[] args) { SchoolGirl mm = new SchoolGirl(); mm.Name = "jiaojiao"; Proxy px = new Proxy(mm); px.GiveChocolate(); px.GiveDolls(); px.GiveFlowers(); Console.WriteLine("Hello World!"); }
3.3 代理模式实现
interface GiveGift { void GiveDolls(); void GiveFolwers(); void GiveChocolate(); } class pursuite:GiveGift { SchoolGirl mm; public pursuite(SchoolGirl mm) { this.mm = mm; } public void GiveDolls() { Console.WriteLine(mm.Name+"give you dolls"); } public void GiveFolwers() { Console.WriteLine(mm.Name + "give you flower"); } public void GiveChocolate() { Console.WriteLine(mm.Name + "give you chocolate"); } } class Proxy:GiveGift { pursuite jzy;//要代理的对象 public Proxy(SchoolGirl mm)//通过构造函数要代理对象的控制 { jzy = new pursuite(mm); } public void GiveDolls() { jzy.GiveDolls(); } public void GiveFolwers() { jzy.GiveFolwers(); } public void GiveChocolate() { jzy.GiveChocolate(); } } static void Main(string[] args) { SchoolGirl mm = new SchoolGirl(); mm.Name = "jiaojiao"; //pursuite ps = new pursuite(mm); Proxy dl = new Proxy(mm); dl.GiveDolls(); dl.GiveFolwers(); dl.GiveChocolate(); Console.WriteLine("Hello World!"); }
4. 代理模式的定义
代理模式: 为其他对象提供一种代理以控制对这个对象的访问。
上述UML图中,
Subject类,都不敢图克RealSubject和Proxy的共用接口,使得在任何使用RealSubject的地方都可以使用Proxy.
abstract class Subject { public abstract void Request(); } class RealSubject : Subject { public override void Request() { Console.WriteLine("真实的请求"); } } class Proxy : Subject { RealSubject realSubject; public override void Request() { if(realSubject == null) { realSubject = new RealSubject(); } realSubject.Request(); } } static void Main(string[] args) { Proxy proxy = new Proxy(); proxy.Request(); }
优秀博客:
https://my.oschina.net/zhangxufeng/blog/1633187
https://cloud.tencent.com/developer/article/1198536
https://www.jianshu.com/p/a8aa6851e09e
原文:https://www.cnblogs.com/mo-lu/p/10274596.html