什么是静态代理?
认识代理模式
代理模式分为动态代理和静态代理。两者的差别还是很大的,不过思想都是一样的,起到一个服务中介的作用。在这里我通过结婚为例进行演示代理模式。
我们结婚一般是找婚庆公司帮我们筹备举办,真实结婚的人是我,婚庆公司就是帮助我们结婚。下面我们就使用一张图来直观的表示一下:
从上图我们能够看出,代理模式其实特别的简单,我们想要结婚,请婚庆公司来帮忙。婚庆公司就是代理。结婚整个流程就是代理模式的应用。
思想我想大家都已经能够明白了,下面看一下类图,再从类的角度分析一下代理模式:
-表示private
#表示protected
~表示default,也就是包权限
_下划线表示static
斜体表示抽象
+表示public
从上面这张图我们可以看到,一共有四个角色:
(1)StacticProxy:相当于用户类,调用代理结婚
(2)Person(结婚的人):是真正结婚的人
(3)HunQinGongSi(婚庆公司):帮助结婚的中介
(4)Marry(抽象对象接口):这里定义了结婚的人想要让婚庆公司做的事,结婚
对代理模式的基本思想有了认识之后,我们就可以好好看看静态代理模式是如何实现的了。
静态模式代码实现
静态代理: 所谓静态代理也就是在程序运行前就已经存在代理类的字节码文件(在真正结婚之前,就已经做好了相关工作,婚庆公司和结婚的人就做好了相关联系)。代理模式就是在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。简单来说静态代理就是在不改变源代码的基础上增加新的功能。
public class StacticProxy {
public static void main(String[] args) {
new HunQinGongSi(new Person()).HappyMarry();
}
}
interface Marry{
void HappyMarry();
}
//真实角色,真正结婚的对象
class Person implements Marry{
@Override
public void HappyMarry() {
System.out.println("战神要结婚了");
}
}
//代理角色,帮助对象结婚
class HunQinGongSi implements Marry{
private Marry target;
public HunQinGongSi(Marry target){
this.target=target;
}
@Override
public void HappyMarry() {
before();
this.target.HappyMarry();
after();
}
private void before() {
System.out.println("结婚前准备离婚材料");
}
private void after() {
System.out.println("结婚后准备离婚");
}
}
打印结果:
总结
代理模式就是这么简单,如果还不理解,动手敲一遍代码就清楚了。