代理模式——java设计模式(十四)
程序员文章站
2024-03-23 08:44:34
...
简介
代理模式(Proxy Pattern):给某一个对象提供一个代理或者占位符,并由代理对象控制对原对象的访问。
- 无法直接访问某个对象,或者访问某个对象有困难时,可以使用一个代理对象来间接访问。
- 代理模式分为多种:
- 远程代理:为不同地址空间的对象提供本地的代理对象。
- 虚拟代理:创建的对象资源消耗大,先创建一个消耗小的代理对象,原对象延时创建。
- 保护代理:控制对象的访问级别。
- 缓冲代理:为操作结果提供临时存储空间,以便多个客户端共享。
- 智能引用代理:对使用的对象提供额外的操作,如日志等。
结构和实现
- 角色包括:
- 抽象主题:声明真实主题和代理主题的共同的业务方法接口,客户端针对抽象主题编程,可以使用代理主题对象替换真实主题对象。
- 代理主题:包含真实主题的引用,提供和真实主题相同的接口,控制真实主题的使用等附加操作。
- 真实主题:实现真实的业务方法。
- 代理模式结构。
实例
- 开发商务信息查询模块,在查询之前用户需要通过身份验证,查询之后需要进行日志记录,方便计费等。希望以一种松耦合的方法增强原始的查询功能,并且客户端一致对待增强前后的模块,方便日后的扩展。
- 使用了保护代理和智能引用代理。
- 代理主题角色。
public string doSearch(string userId, string keyword)
{
//如果身份验证成功,则执行查询
if (this.validate(userId,keyword))
{
string result = searcher.doSearch(userId, keyword); //调用真实主题对象的查询方法
this.log(userId); //记录查询日志
return result; //返回查询结果
}
else
{
return null;
}
}
public bool validate(String userId, String keyword)
{
return validator.validate(userId, keyword);
}
public void Log(string userId)
{
logger.log(userId);
}
远程代理
- 使得客户端可以访问远程主机上的对象。
- 将网络细节隐藏,使得客户端不必考虑网络的存在。
- java中可以通过RMI的机制实现远程代理,使一个虚拟机中的对象调用另一个虚拟机中的对象。客户端对象通过一个桩对象与远程主机通信,远程主机使用骨架对象负责处理这一通信,找到需要的对象。
虚拟代理
- 由于对象本身复杂或者网络延时等,加载对象需要较长时间,可以使用一个加载快、相对小的对象代表真实对象,同时使用其他线程加载真实对象,大大加速系统的启动时间。
- 一个对象加载十分消耗资源时,可以使用消耗资源小的对象暂时代替,需要使用时在创建真实对象。
动态代理
- 静态代理:代理类在编译期已经存在在.class文件中。
- 动态代理:程序运行时,通过反射机制动态创建而成。
- 如果需要为不同的主题类提供代理,需要一一增加代理类,导致类个数急剧增加,所以需要在运行时创建动态代理。
- 通常动态代理有:jdk、cglib。jdk和cglib动态代理详解
优缺点和适用环境
- 优点:
- 协调调用。降低系统耦合。
- 针对抽象主题编程。增加具体主题无需修改源码,符合开闭原则,局域较好的灵活性和扩展性。
- 远程代理将一些资源消耗大的对象和操作转移至性能更好的计算机上,提高系统整体效率。
- 虚拟代理使用资源消耗小的对象代表真实对象,节省系统开销。
- 缓冲代理为操作结果提供临时空间,方便后续共享这一结果,缩短响应时间。
- 保护代理控制对象的访问权限。
- 缺点:
- 处理速度慢。增加了代理对象。
- 需要额外的工作。代理实现复杂。
- 适用环境:
- 客户端小使用远程主机中的对象,使用远程代理。
- 使用较少资源的对象代表原始对象,使用虚拟代理。
- 为被频繁方位的操作结果提供缓存,加速响应,使用缓冲代理。
- 控制对象为不同用户提供不同的访问权限,使用保护代理。
- 为一个对象提供额外的操作,使用智能引用代理。