七个结构型模式7:代理模式-Proxy Pattern【学习难度:★★★☆☆,使用频率:★★★★☆】
来源:互联网 发布:msg用什么软件打开 编辑:程序博客网 时间:2024/06/18 13:12
在软件开发中,也有一种设计模式可以提供与代购网站类似的功能。由于某些原因,客户端不想或不能直接访问一个对象,此时可以通过一个称之为“代理”的第三者来实现间接访问,该方案对应的设计模式被称为代理模式。
代理模式是一种应用很广泛的结构型设计模式,而且变化形式非常多,常见的代理形式包括远程代理、保护代理、虚拟代理、缓冲代理、智能引用代理等,后面将学习这些不同的代理形式。
代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。
代理模式是一种对象结构型模式。在代理模式中引入了一个新的代理对象,代理对象在客户端对象和目标对象之间起到中介的作用,它去掉客户不能看到的内容和服务或者增添客户需要的额外的新服务。
代理模式的结构比较简单,其核心是代理类,为了让客户端能够一致性地对待真实对象和代理对象,在代理模式中引入了抽象层,代理模式结构如图15-2所示:
由图15-2可知,代理模式包含如下三个角色:
(1) Subject(抽象主题角色):它声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题,客户端通常需要针对抽象主题角色进行编程。
(2) Proxy(代理主题角色):它包含了对真实主题的引用,从而可以在任何时候操作真实主题对象;在代理主题角色中提供一个与真实主题角色相同的接口,以便在任何时候都可以替代真实主题;代理主题角色还可以控制对真实主题的使用,负责在需要的时候创建和删除真实主题对象,并对真实主题对象的使用加以约束。通常,在代理主题角色中,客户端在调用所引用的真实主题操作之前或之后还需要执行其他操作,而不仅仅是单纯调用真实主题对象中的操作。
(3) RealSubject(真实主题角色):它定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的操作。
代理模式的结构图比较简单,但是在真实的使用和实现过程中要复杂很多,特别是代理类的设计和实现。
抽象主题类声明了真实主题类和代理类的公共方法,它可以是接口、抽象类或具体类,客户端针对抽象主题类编程,一致性地对待真实主题和代理主题,典型的抽象主题类代码如下:
abstract class Subject { public abstract void Request(); }
真实主题类继承了抽象主题类,提供了业务方法的具体实现,其典型代码如下:
class RealSubject : Subject { public override void Request() { //业务方法具体实现代码 } }
代理类也是抽象主题类的子类,它维持一个对真实主题对象的引用,调用在真实主题中实现的业务方法,在调用时可以在原有业务方法的基础上附加一些新的方法来对功能进行扩充或约束,最简单的代理类实现代码如下:
class Proxy : Subject { private RealSubject realSubject = new RealSubject(); //维持一个对真实主题对象的引用 public void PreRequest() { …... } public override void Request() { PreRequest(); realSubject.Request(); //调用真实主题对象的方法 PostRequest(); } public void PostRequest() { …… } }
我的总结:我觉得这个这个其实很常用,自己也用过,可以参考下面的一个类图:
可以参考这个例子商务信息查询系统的开发任务
参考链接:
代理模式
- 七个结构型模式7:代理模式-Proxy Pattern【学习难度:★★★☆☆,使用频率:★★★★☆】
- 七个结构型模式3: 组合模式-Composite Pattern【学习难度:★★★☆☆,使用频率:★★★★☆】
- 七个结构型模式1: 适配器模式-Adapter Pattern【学习难度:★★☆☆☆,使用频率:★★★★☆】
- 七个结构型模式2:桥接模式-Bridge Pattern【学习难度:★★★☆☆,使用频率:★★★☆☆】
- 七个结构型模式4:装饰模式-Decorator Pattern【学习难度:★★★☆☆,使用频率:★★★☆☆】
- 七个结构型模式5:外观模式-Facade Pattern【学习难度:★☆☆☆☆,使用频率:★★★★★】
- 七个结构型模式6: 享元模式-Flyweight Pattern【学习难度:★★★★☆,使用频率:★☆☆☆☆】
- 十一个行为型模式7:观察者模式-Observer Pattern【学习难度:★★★☆☆,使用频率:★★★★★】
- 十一个行为型模式4:迭代器模式-Iterator Pattern【学习难度:★★★☆☆,使用频率:★★★★★】
- 六个创建型模式2:工厂方法模式-Factory Method Pattern 【学习难度:★★☆☆☆,使用频率:★★★★★】
- 十一个行为型模式2:命令模式-Command Pattern【学习难度:★★★☆☆,使用频率:★★★★☆】
- 六个创建型模式3: 抽象工厂模式-Abstract Factory Pattern【学习难度:★★★★☆,使用频率:★★★★★】
- 六个创建型模式5: 原型模式-Prototype Pattern【学习难度:★★★☆☆,使用频率:★★★☆☆】
- 六个创建型模式6:建造者模式-Builder Pattern【学习难度:★★★★☆,使用频率:★★☆☆☆】
- 十一个行为型模式3:解释器模式-Interpreter Pattern【学习难度:★★★★★,使用频率:★☆☆☆☆】
- 十一个行为型模式8:状态模式-State Pattern【学习难度:★★★☆☆,使用频率:★★★☆☆】
- 六个创建型模式1:简单工厂模式-Simple Factory Pattern【学习难度:★★☆☆☆,使用频率:★★★☆☆】
- 六个创建型模式4: 单例模式-Singleton Pattern【学习难度:★☆☆☆☆,使用频率:★★★★☆】
- SVD算法以及改进后的LFM模型在推荐系统的应用
- Class String 方法学习
- 算法小程序 字符串循环右移
- Centos7 mysql主从复制
- jquery实现button按钮的点击事件
- 七个结构型模式7:代理模式-Proxy Pattern【学习难度:★★★☆☆,使用频率:★★★★☆】
- oracle之表的管理
- Python-进程管理Supervisord
- 利用Delphi的File Of Type创建并管理属于你自己的数据库
- 关于JS中for循环时,作用域问题和this指针指向的总结
- 网络应用的体系结构
- python爬虫实战(一)--爬取知乎话题图片
- 数据结构第二周项目--体验复杂度之两种排序算法的运行时间
- 剑指offer 32 整数中1出现的次数