静态代理
一个场景设定,假设你要结婚了,但你不会为了结婚就要学婚礼布置,拍婚纱照等技术活,这些可以交给婚庆公司做嘛。于是你找了婚庆公司作为你的代理为了做一些准备工作。但最后去结婚的是你而不婚庆公司。这就是代理模式了。
静态代理有三个元素:共同接口、代理对象、目标对象。
代码
接口1
2
3public interface Marry {
void marry();
}
代理类,把接口当做参数传入构造函数中1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public class MarryCompany implements Marry {
Marry marry;
public MarryCompany(Marry marry) {
this.marry = marry;
}
void proWwork() {
System.out.println("婚礼前准备");
}
void afterWwork() {
System.out.println("婚礼后收拾");
}
@Override
public void marry() {
proWwork();
marry.marry();
afterWwork();
}
}
目标对象1
2
3
4
5public class You implements Marry{
public void marry(){
System.out.println("我结婚了");
}
}
1 | public class Test { |
问题
静态代理不实现接口也能做到,为什么还要实现共同接口?接口的作用是保证了代理对象具有和被代理对象具有一样的契约。
“代理”是针对相同的接口编程,以达到透明地替换原来的对象。如果添加一个不相干新的类去做这件事,这叫委托模式了。
静态代理总结:
优点:可以做到在不修改目标对象的功能前提下,对目标功能扩展.
缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护。此时动态代理闪亮登场!
动态代理
在动态代理中我们不再需要再手动的创建代理类,我们只需要编写一个动态处理器就可以了。真正的代理对象由JDK再运行时为我们动态的来创建。
比如这次不是我结婚了,而是我的宠物猫jack和rose要举行婚礼
代码
待完善