网站首页 > java教程 正文
1.代理模式的功能
代理模式是通过创建一个代理对象,用这个代理对象去代表真实的对象,客户端得到这个代理对象后,对客户端并没有什么影响,就跟得到了真实对象一样的来使用.
当客户端操作这个代理对象的时候,实际上功能最终还是会由真实的对象来完成,只不过是通过代理操作的,也就是客户端操作代理,代理操作真正的对象.
正是因为有代理对象夹在客户端和被代理的真实对象中间,相当于一个中转,那行在中转的时候就有很多花招可以玩,比如,判断一下权限,如果没有足够的权限那就不给你中转了,等等.
2.代理的分类
事实上代理又被分成多种,大致有如下一些.
■ 虚代理: 根据需要来创建开销很的对象,该对象只有在需要的时候 才会被真正创建.
■ 远程代理: 用来在不同的地址空间上代表同一个对象,这个不同的地址空间可以是在本机,也可以在 其他机器上.在Java里面最典型的就是RMI技术.
■ copy-on-write代理: 在客户端操作的时候,只有对象确实改变了,才会真的拷贝(或克隆)一个目标对象,算是虚代理的一个分支.
■ 保护代理: 控制对原始对象的访问,如果有需要,可以给不同的用户提供不能的访问权限,以控制他们对原始对象的访问.
■ Cache代理: 为那些昂贵操作的结果提供临时的存储空间以便多个客户端可以共享这些结果.
■ 防火墙代理: 保护对象不被恶意用户访问操作.
■ 同步代理: 使多个用户能够同时访问目标对象而没有冲突.
■ 智能指引:
在这些代理类型中,最常见的是虚代理 \ 保护代理 \ 远程代理和智能指引这几种.这是实际开发中使用频率最高的两种代理.
对于过程代理,没有去讨论,因为在Java中,远程代理的典型体现是RMI技术,要想把远程代理讲述清楚,就需要把RMI讲述清楚,这不在这里讨论范围之内.
对于智能指引,基本的实现方式和保护代理的实现类似,只是实现的具体功能有所不同,因此也没有具体去讨论和示例
3.虚代理的示例
起初每个代理对象只有用户编号和姓名数据,直到需要的时候,才会把整个用户的数据装载到内存中来.
也就是说,要根据需要来装载整个UserModel的数据,虽然用户数据对象是前面已经创建好了的,但是只有用户编号和姓名数据,可以看成是一个"虚"的对象,直到通过代理把所有的数据都设置好,才算是一个完整的用户数据对象.
4.copy-on-write
复制一个大的对象是很消耗资源的,如果这个被复制的对象从上次操作以来,根本就没有被修改过,那行再复制这个对象是没有必要的.只是白白消耗资源而已.于是使用代理来延迟复制的过程,可以等到对象被修改的时候才真正地对它进行复制.
copy-on-write可以大大降低复制大对象的开销,因此它算是一种优化方式,可以根据需要来复制或者克隆对象.
5.具体目标和代理的关系
从代理模式的结构图来看,好像是有一个具体目标类就有一个代理类,其实不是这样的,如果代理类能完全通过接口来操作它所代理的目标对象,那么代理对象就不需要知道具体的目标对象,这样就无须为每一个具体目标类都创建一个代理类了.
但是,如果代理类必须要实例化它代理的目标对象,那么代理类就必须知道具体被代理对象,这种情况下,一个具体目标类通常会有一个代理类,这种情况多出现在虚代理的实现里面.
6.代理模式调用顺序示意图
代理模式调用顺序如图:
保护代理
保护代理是一种控制对原始对象访问的代理,多用于对象应该有不同的访问权限的时候,保护代理会检查用者是否具有请求所必需的访问权限,如果没有相应的权限,那么就不会调用目标对象,从而实现对目标对象保护.
喜欢的点赞加关注,下方评论留言给我,我们一起来探讨问题[呲牙]
- 上一篇: 拿这篇Java代理模式学习,肯定够用
- 下一篇: 「每天一个知识点」精讲设计模式之代理模式
猜你喜欢
- 2024-10-24 Java动态代理与静态代理以及它能为我们做什么
- 2024-10-24 Java 设计模式 之 代理模式 (1)(java设计模式之代理模式)
- 2024-10-24 Java设计模式:代理模式 vs. 装饰模式
- 2024-10-24 设计模式篇——代理模式详解(面试再问你代理模式,这么回答他)
- 2024-10-24 动态代理大揭秘,带你彻底弄清楚动态代理
- 2024-10-24 面试:Java的代理模式动态代理和静态代理区别,aop用的什么代理
- 2024-10-24 Java设计模式之代理模式(java代理类是什么)
- 2024-10-24 JAVA设计模式——代理模式(java编写代理服务)
- 2024-10-24 23种java设计模式之:门面模式、享元模式、代理模式
- 2024-10-24 Java 17中的动态代理:实现灵活的代理模式
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)