代理模式类图:
静态代理
- 真实对象和代理对象都要实现一个接口
- 代理对象要代理真实角色
- 优点:代理对象可以做很多真实对象做不了的事情;真实对象专注做自己的事情
- 缺点:由于代理只能为一个类服务,如果需要代理的类很多,那么就需要编写大量的代理类
public class StaticProxy {
public static void main(String[] args) {
WeddingCompany weddingCompany=new WeddingCompany(new You());
weddingCompany.happyMarry();
}
}
interface Marry{
void happyMarry();
}
//真实角色
class You implements Marry{
@Override
public void happyMarry() {
System.out.println("秦老师要结婚了,超开心");
}
}
//代理角色,帮助你结婚
class WeddingCompany implements Marry{
private Marry target;
public WeddingCompany(Marry target) {
this.target = target;
}
@Override
public void happyMarry() {
before();
this.target.happyMarry();
after();
}
private void after() {
System.out.println("结婚之后,收尾款");
}
private void before() {
System.out.println("结婚之前,布置现场");
}
}
-
代理模式在多线程的用法
public class StaticProxy { public static void main(String[] args) { You you=new You(); new Thread(()->System.out.println("i love you")).start(); //Thread类是代理对象,实现Runnable接口的类是真实对象 new WeddingCompany(new You()).happyMarry(); // WeddingCompany weddingCompany=new WeddingCompany(new You()); // weddingCompany.happyMarry(); } }
动态代理
动态代理利用了JDK API,动态地在内存中构建代理对象,从而实现对目标对象的代理功能。
动态代理对象不需要实现接口,但是要求目标对象必须实现接口,否则不能使用动态代理。
动态代理的实现方式:
- 基于接口的动态代理--JDK动态代理
- 基于类的动态代理:cglib
- java字节码实现:javasist
在这里,我们使用JDK动态代理,为此,我们需要了解两个类:Proxy和InvocationHandler