代理模式(Proxy Pattern)动态代理
关注大神好久了,今天跟大神学一下代理模式。
1.为什么要使用动态代理
1个静态代理只服务一种类型的目标对象,若要服务多类型的目标对象,则需要为每种目标对象都实现一个静态代理对象。
在目标较多情况下,采用静态代理,则会出现静态代理对象量多、打码量大、从而导致代码复杂的问题
2.实现原理
设计动态代理类(DynamicProxy)时,不需要显式实现与目标对象类(RealSubject)相同的接口,而是将这种实现推迟到程序运行时由JVM来实现。
1.在使用时再创建动态代理类&实例
2.静态代理则是在代理类实现时就指定目标对象类(RealSubject)相同的接口
通过java反射机制method.invoke(),通过调用动态代理类对象方法,从而自动调用目标对象的方法。
2.1优点
只需要1个动态代理类就可以解决创建多个静态代理的问题,避免重复多余代码,有更强的灵活性
2.2缺点
效率低:相比静态代理中直接调用目标对象方法,动态代理则需要先通过java反射机制,从而间接调用目标对象方法。
应用场景局限:因为java的单继承特性(每个代理类都继承了Proxy类)即只能针对接口创建代理类,不能针对类创建代理类(即只能动态代理实现了接口的类)
2.3应用场景
基于静态代理应用场景下,需要代理对象数量较多的情况下使用动态代理。
AOP领域:
1.定义:即面向切面编程,是OOP的延续、函数式编程的一中衍生泛型
2.作用:通过预编译方式和运行期动态代理实现程序功能的统一维护。
3.优点:降低业务逻辑各部分之间的耦合度、提高程序的可重用性&提高了开发的效率
4.具体应用场景:日志记录、性能统计、安全控制、异常处理等
3.具体应用
3.1实例概况
背景:小成 希望买一台最新的Mac电脑,小何希望买一台Iphone
冲突:国内还没上,只有美国才有
解决方案:需找一个代购进行购买
1.即1个代购(动态代理对象)同时代替小成&小何(目标对象)去买mac(间接访问的操作)
- 该代购是代购任何商品=什么人有什么需求就回去代购任何东西(动态代理)
3.2使用步骤
1.声明调用处理器类
2.声明目标对象类的抽象接口
3.声明目标对象类
4.目标类对象通过动态代理对象调用目标对象的方法
4.1创建调用处理器类对象
4.2创建目标对象对象
4.3创建动态代理类&对象(通过反射获取构造函数)
4.4通过调用动态代理方法从而调用目标对象方法(调用父类的invoke,之后通过反射调用方法)