代理模式(Proxy)
代理模式在Java开发中也算经常使用的,如Spring AOP ,Mybatis Mapper代理
生活中代理模式也非常常见,比如某某食品厂生产了一种新口味巧克力,那自己如何将它从工厂分销到消费者手里呢,让消费者来自己的工厂购买无疑是不合适的,于是乎,某某巧克力全国总代理、全省总代理、全市总代理就出现了,消费者只需要在自己需要的时候,就方便的可以获取到它
代理模式使用场景
- 原对象已经存在, 不好去直接改动它的内容
- 对原对象的方法提供的能力基础上,需要增加一些业务逻辑
代理模式实现方式
- 静态代理
- 动态代理
静态代理
本质上来说,静态代理的好处就是性能会好一些,因为是主动的编写代理类的实现,即实现业务增加需求的代码来实现的,因此不存在一个动态生成的过程
比较特殊的一种玩法就是像dubbo中的使用,它没有要求手写业务的静态代理类的实现,但是它自己本身通过字符串拼接的方式,输出了一个完整的.java文件并编译成了.class字节码文件,最后load到内存中,本质上同样属于静态代理
-Compiler接口默认指定javassist实现,即静态代理实现
demo
- 定义一个人类的抽象接口
/**
* @author xiaoyingge
* @description
* @date 2020/4/25 15:25
*/
public interface Human {
void run ();
}
- 定义男性的实现并实现跑步接口
/**
* @author xiaoyingge
* @description
* @date 2020/4/25 15:24
*/
public class Man implements Human {
@Override
public void run () {
System.out.println("开始跑步~~~~~~~~~~");
System.out.println("结束跑步~~~~~~~~~~");
}
}
- 定义静态代理类,在跑步前进行热身,跑步后进行拉伸
/**
* @author xiaoyingge
* @description
* @date 2020/4/25 15:26
*/
public class HumanProxy implements Human {
private Human human;
public HumanProxy (Human human) {
this.human = human;
}
@Override
public void run ()