设计模式~代理模式
时间:2022-07-23
本文章向大家介绍设计模式~代理模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
代理模式是对象的结构模式。
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
代理模式的英文叫做Proxy或 Surrogate,中文都可翻译为 代理。
所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。
在一些情况下,一个客户不想或者不能直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理的种类:
如果按照使用目的划分,
- 远程代理(Remote): 为一个位于不同的地址空间的对象提供一个局域代表对象。
- 虚拟代理(Virtual): 根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。
- Copy-on-Write 代理: 虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
- 保护代理(Protect or Access): 控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。
- Cache代理: 为某个目标操作的结构提供临时的存储空间,以便多个客户端可以共享这些结果。
- 防火墙代理(Firewall): 包含目标,不让恶意用户接近。
- 同步化代理(Synchronization): 使几个用户能够同时使用一个对象而没有冲突。
- 智能引用代理(Smart Reference): 当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。
代理模式的结构
代理模式涉及的角色:
- 抽象主题角色:声明了真实主题和代理主题的共同接口,这样一来,在任何可以使用真实主题的地方都可以使用代理主题。
- 代理主题角色(Proxy): 代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象:代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主题。
- 真实主题角色: 定义了代理角色所代表的真实对象。
示意性源码:
抽象主题角色
public abstract class Subject {
/**
* 声明一个抽象的请求方法
*/
abstract public void request();
}
真实主题角色
public class RealSubject extends Subject {
/**
* 构造函数
*/
public RealSubject(){
}
@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("From real subject");
}
}
代理主题角色
public class ProxySubject extends Subject {
private RealSubject realSubject;
public ProxySubject(){}
@Override
public void request() {
preRequest();
if(realSubject == null){
realSubject = new RealSubject();
}
realSubject.request();
postRequest();
}
/**
* 请求前的操作
*/
private void preRequest(){
// something you want to do before requesting
}
/**
* 请求后的操作
*/
private void postRequest(){
// something you want to do after requesting
}
}
客户端调用
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Subject subject = new ProxySubject();
subject.request();
}
}
代理模式的优缺点
根据代理种类的不同,代理模式有不同的特点。
远程代理
优点是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。
由于客户可能没有意识到会启动一个耗费时间的远程调用,因此客户没有必要的思想准备。
虚拟代理
优点是代理对象可以在必要的时候才被代理的对象加载。代理可以对加载过程加以必要的优化。当一个模块的加载十分耗费资源的时候,虚拟代理的优点就非常明显。
例如:加载图片时,会在加载的过程显示正在加载中,而加载完成后,则替换成目标图片。
保护代理
优点是它可以在运行时间对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理对象。
智能引用代理
在访问一个对象时,可以执行一些内务处理操作,比如计数操作等。
- Angularjs基础(十)
- Mac 中JetBrain 系列IDE 的配置文件同步(通过Dropbox)
- 面向服务架构(SOA)和企业服务总线(ESB)
- UPS宣布加入货运区块链联盟 价值万亿的物流行业未来将无纸化?
- Android中动态更新ListView
- 关于机器学习,这可能是目前最全面最无痛的入门路径和资源!
- 并行计算Brahma :LINQ-to-GPU
- 实例演示Android异步加载图片
- Eclipse快捷键大全
- Entity Framework 和NHibernate的区别
- Angularjs基础(九)
- Silverlight 2 应用程序部署到任意HTML页面
- 人工智能积极赋能保险业
- 推荐一个工具包自定义HTTP 404错误
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 腾讯云ES集群通过COS实现跨地域备份与恢复
- Thymeleaf一篇就够了
- python scipy.stats实现各种常见的统计分布
- 操作系统基础 - 文件系统
- Linux升级OpenSSH修复高危漏洞
- Pytest之收集用例及命令行参数
- CVE-2020-14645:Weblogic远程代码执行复现
- 从0到1开发测试平台(七)后端服务添加swagger第三方类库
- leetcode - 分割数组的最大值
- leetcode - 除数博弈
- leetcode - 最小路径和
- Javascript中的数据类型
- JAVA 应用日志最佳实践
- 用pageadmin cms系统进行网站制作的经验总结
- 14个Linux系统安全小妙招,总有一招用的上