【设计模式】第15章·代理模式
一、代理模式概述
由于某些原因,客户端不想或不能直接访问一个对象,此时可以通过一个称为“代理”的第三者来实现间接访问,该方案对应的设计模式被称为代理模式。
定义如下:
代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。
二、代理模式结构和实现
2.1 代理模式结构
代理模式包含3个角色:
- Subject(抽象主题角色):声明了真实主题和代理主题的共同接口。
- Proxy(代理主题角色):包含了对真实主题的引用。
- RealSubject(真实主题角色):实现了真实的业务操作。
2.2 代理模式实现
代理模式有很多种实现,根据目的和实现方式不同可以分为很多种。
本文demo案例介绍下静态代理和JDK动态代理这两种。
静态代理
//抽象主题对象
public interface Subject {void request();}
//具体的真实主题对象
public class RealSubject implements Subject{@Overridepublic void request() {System.out.println("真实主题的业务方法");}
}
//代理对象
public class ProxySubject implements Subject{private Subject subject = new RealSubject();@Overridepublic void request() {System.out.println("前置方法代码");subject.request();System.out.println("后置方法代码");}
}
动态代理
//抽象主题对象
public interface IUserDao {void save();}
//具体的真实主题对象
public class UserDao implements IUserDao{@Overridepublic void save() {System.out.println("保存了数据");}
}
//代理对象
public class IUserDaoFactory {//代理的目标对象private Object target;public IUserDaoFactory(Object target) {this.target = target;}//对目标对象进行动态代理public Object getProxyInstance() {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("做一些操作A");Object resultValue = method.invoke(target, args);System.out.println("做一些操作B");return resultValue;}});}
}
//客户端
public class Client {public static void main(String[] args) {//静态代理Subject subject = new ProxySubject();subject.request();//JDK动态代理demoIUserDao userDao = new UserDao();IUserDaoFactory factory = new IUserDaoFactory(userDao);IUserDao proxyUserDao = (IUserDao) factory.getProxyInstance();proxyUserDao.save();}
}
三、代理模式优缺点和适用环境
3.1 代理模式的优点
- 协调调用者和被调用者,在一定程度上降低了系统的耦合度;
- 系统具有较好的灵活性和可扩展性,客户端可以针对抽象主题角色进行编程,增加和更换代理类无需修改源码,符合开闭原则。
3.2 代理模式的缺点
- 有些类型的代理模式可能会造成请求的处理速度变慢;
- 实现代理模式需要一些额外的工作,而且有些代理模式的实现过程较为复杂。
3.3 代理模式的适用环境
代理模式的类型较多,不同类型的代理模式有不同的优缺点,应用于不同的场合。
- 客户端对象需要访问远程主机中的对象时,使用远程代理。
- 使用较少资源对象代表较大资源对象时,使用虚拟代理。
- 控制对象为不同用户提供不同的权限时,使用保护代理。
- 为一个对象提供额外的操作,使用智能引用代理。
- 为被频繁访问的操作结果提供缓存,加速响应,使用缓存代理。
【参考文献】:
本文是根据刘伟的《Java设计模式》一书的学习笔记,仅供学习用途,勿做其他用途,请尊重知识产权。
【本文代码仓库】:https://gitee.com/xiongbomy/java-design-pattern.git
【设计模式】第15章·代理模式相关推荐
- 第 15 章 代理模式
第 15 章 代理模式 1.代理模式的基本介绍 代理模式:为一个对象提供一个替身,以控制对这个对象的访问. 即通过代理对象访问目标对象. 代理对象的好处是:可以在目标对象实现的基础上,增强额外的功能操 ...
- 【设计模式】第二章 代理模式
第二章 代理模式 文章目录 第二章 代理模式 一.简介 一.静态代理 二.动态代理 1.JDK 代理 2.CGLib 代理 三.总结 一.简介 你可能会对这个设计模式感到陌生,但是你对 Spring ...
- 设计模式笔记15:代理模式(Proxy Pattern)
一.代理模式的内容 代理模式为另一个对象提供一个替身或占位符以访问这个对象. 给某一个对象提供一个代理,并由代理对象控制对原对象的引用.代理模式的英文叫做Proxy或Su ...
- Java设计模式(10)代理模式(Proxy模式)
理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...
- 设计模式(四)--代理模式
设计模式(四)–代理模式 文章目录 设计模式(四)--代理模式 其他链接 代理模式 1.简介 2.静态代理 角色 代码实现 好处 3.动态代理 代码实现 解析 其他链接 JVM学习笔记(一) JVM学 ...
- 【设计模式与体系结构】代理模式
[设计模式与体系结构]代理模式 文章目录 [设计模式与体系结构]代理模式 一.实例分析 二.代码实现 三.实现结果 一.实例分析 (1) 代理模式设计一个房产中介的模拟程序. 要求:房产中介有介绍和代 ...
- 设计模式学习之1—代理模式
设计模式学习之1-代理模式 0.?先看这里 --- 诗雨的学习说明 1.从生活中初识代理 2.代理模式的类图和角色 3.静态代理和动态代理 4.静态代理 和 动态代理 的 使用模板 4.1 静态代理使 ...
- 《拉勾Java高薪课程》阶段一输出 之 通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式)--菜鸟小回
通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式) 文章目录 通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式) @[toc] 一.单例模式 1. 相关概念 2. 演示思路 3. ...
- Head First设计模式读书笔记十 第十一章 代理模式
之前的总结链接 https://blog.csdn.net/u011109881/article/details/59191308 代理模式本身的框架结构并不难理解,但是在实际应用中,我们往往被实际应 ...
最新文章
- Android Html.fromHtml 的使用
- 我的Android进阶之旅------Android嵌入图像InsetDrawable的用法
- 虚拟机WIN7显示主机ubuntu的文件
- [日更-2019.5.2、3、4] 关于JVM的概略分析
- python信息管理系统统计功能_用Python实现职工信息管理系统
- python安装email模块_Python使用SMTP模块、email模块发送邮件
- 在workflow中,无法为实例 ID“...”传递接口类型“...”上的事件“...” 问题的解决方法。...
- Java实现生产消费模型的5种方式
- 大数据 -- Spark
- Collection集合 创建/添加/迭代
- iOS 对付内存泄漏,来说说我的调试方法
- copula函数(高斯copula函数)
- JavaScript实现简单计算器
- C# PPT/PDF文件转图片,图片转PPT
- 《麻省理工学院公开课:人工智能》笔记一
- GHO文件安装全教程
- 设计心理学2-与复杂共处【读书笔记】
- 程序的优化 文字的减法
- Swift和正则表达式:语法
- 如何对网站漏洞修补进行渗透测试