调用者 代理对象 目标对象
代理对象除了可以完成核心任务,还可以增强其他任务,无感的增强
代理模式目的:
不改变目标对象的目标方法的前提,去增强目标方法
分为:静态代理,动态代理
静态代理
有对象->前提需要有一个类,那么我们可以事先写好一个类,他是一个代理类
程序员为目标类编写一个代理类(用于增强目标方法),要求目标类和代理类实现同一个接口,让用户感觉代理和目标是一类的东西,无感的
创建一个maven
创包com.fs.staticproxy
创目标类和代理类的统一接口:
创建目标类:
目标方法之前可能需要扩展 日志记录 权限管理等等 这些不是非核心代码、功能,可能就是一些简单的业务,但是又不省略,但是他又不是固定的,时可变的,而卸载目标类就是硬代码
创建代理类:代理代理 -> 我中有你 有一个目标对象
出现问题:重复
解决办法:我(代理类)中有(目标类)你
给属性复赋值:构造方法 set方法 实现了代理类增强方法
测试类(调用者):
需要改变时,目标对象、目标类不需要改变,核心代码不用改变,,只需要改代理对象
缺点:多个接口要实现相同的方法,增强相同的方法,那么需要创建很多个代理类,这是不对的,
核心接口加方法,代理类也要加方法实现对应的方法,目标对象和代理类都需要维护
导致静态代理的缺点问题根源->代理类的存在
动态代理
这个静态代理类不要你写,通过code动态生成
存的是BussinessInterface接口 -> 使得这个代理类代理的范围更加多一点,不再只有Buiness这一个实现类的代理类,他可以实现只要你的目标类实现BussinessInterface这一类 统一接口下面所有的不同类型的这个目标类都可以被我的代理类所代理
站在使用者这边,我们在乎的是代理类对象,而不是代理类,基于这个,
jdk可以自动生成生成这个代理类对象,确实可以实现,我要代哪一个接口,接口告诉我,然后jdk有一个api方法,经过这个api方法的时候,他就可以得到一个api代理对象,此时1我就不需要代理类了,我直接用这个代理对象就行了
接口不能创建方法,因为它没有构造方法(用于创建对象),,现在想创建对象,
根据接口的创建对象,没有这个类,没有这个构造方法,也可以通过反射得到对象,通过反射得到Class对象,调用它的构造方法得到对象
我们现在需要一个类 class 由于接口不能创建构造方法,所以我们需要根据接口的class来克隆/生成一个类的class,这个类的classs是构造方法的class根据 根据接口的class对象生成类的class对象,这个类的class对象复制了接口的所有的方法,同时他又有构造方法。