代理模式:定义:为其他对象提供一种 代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用
组成: 包括 抽象角色:通过接口或抽象类声明真实角色实现的业务方法
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用
代理模式 常见的应用:
一。远程代理。也就是一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在不同的空间的事实,net 中 Webservice 的应用 。客户端调用代理就可以进行远程访问
二,虚拟代理:根据需要创建开销很大的对象,通过了他来存放实例化的对象。例如 网络加载图片,网速不好时会有看到 图片边框先出来边框 ,它来占位
三,安全代理:用来控制真实对象的访问权限 。比如说 贴吧 不同的 等级 有不同的 权限
四。智能指引:是指当调用真实的对象时,额外处理一些其他的事情
代理模式的一个好处就是对外部提供统一的接口方法,而代理类在接口中实现对真实类的附加操作行为,从而可以在不影响外部调用情况下,进行系统扩展。
也就是 我们(A) 与真正的 另一方(c) 之间 有一个 第三者(B) , 为了 一些 特性的(安全,协助,,等原因 ),我们会把自己对 C 的 操作 转为 B 代 实现 。这样 避免了 直接 与 C 的 联系 造成的 其他 (D ,E..) 的影响
代理 模式 体现了 前面说的 开放关闭原则
举一个 买东西 的例子 我想 炒股 ,由于 菜鸟不会, 就让 A 代 我去 操作。
1.提取 公共行为 。封装成接口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 定义了 真实对象 RealRole 和 代理 Proxy 的 所要进行的 “活动”方法, 即 抽象角色 /// </summary> public abstract class StockType { //买银行股票 public abstract void BuyBankStock(); //买国债股票 public abstract void BuyCountryStock(); // 买石油股票 public abstract void BuyShiYouStock(); // 买医药股票 public abstract void BuyYiYaoStock(); }
2.真正的买家(股票交易所的账户) 使用这些行为 说明 自己 想要 做哪些东西
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
String Person = ""; public RealBuy(String Person) { this.Person = Person; } public override void BuyBankStock() { Console.WriteLine(Person + "要买银行股"); } public override void BuyCountryStock() { Console.WriteLine(Person + "要买国家股"); } public override void BuyShiYouStock() { Console.WriteLine(Person + "要买石油股"); } public override void BuyYiYaoStock() { Console.WriteLine(Person + "要买医药股"); }
3, 代理 也 继承 这些 行为 它 从 客户端 获得 使用 对象后, 再 从 实例化真正的买家
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
String Person = ""; public RealBuy(String Person) { this.Person = Person; } public override void BuyBankStock() { Console.WriteLine(Person + "要买银行股"); } public override void BuyCountryStock() { Console.WriteLine(Person + "要买国家股"); } public override void BuyShiYouStock() { Console.WriteLine(Person + "要买石油股"); } public override void BuyYiYaoStock() { Console.WriteLine(Person + "要买医药股"); }
4. 客户端 调用 代理
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
String Person = ""; public RealBuy(String Person) { this.Person = Person; } public override void BuyBankStock() { Console.WriteLine(Person + "要买银行股"); } public override void BuyCountryStock() { Console.WriteLine(Person + "要买国家股"); } public override void BuyShiYouStock() { Console.WriteLine(Person + "要买石油股"); } public override void BuyYiYaoStock() { Console.WriteLine(Person + "要买医药股"); }
例子不是很准确 ,把真正的 买家 理解成 交易所, 我们 把自己的名字 想买的 股票类型 ——》 代理 代理 把 名字 给 交易所 (实例化出 一个 账户对象)
然后 这个对象(指我们自己) 采取购买 这个实例化的方法,返回 真实对象(交易所)设定的用户账号的 方法
代理模式和装饰模式的一些区别:
装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。
换句话 说,用代理模式,代理类(proxy )可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。然而,当 我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。