代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。
简言之,代理模式就是设置一个中间代理来控制访问原目标对象,以达到增强原对象的功能和简化访问方式。
静态代理
这种代理方式需要代理对象和目标对象实现一样的接口。
优点:可以在不修改目标对象的前提下扩展目标对象的功能。
缺点:
- 冗余。由于代理对象要实现与目标对象一致的接口,会产生过多的代理类。
- 不易维护。一旦接口增加方法,目标对象与代理对象都要进行修改。
示例:
package Multithreading.proxy.staticProxy;
public class StaticProxy {
public static void main(String[] args) {
// 普通调用
new You().happyMarry();
System.out.println("--------------------");
// 代理模式 加了一个婚庆公司(代理)
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() {
this.target.happyMarry();
}
}
我们来对比这两行代码
new Thread(() -> System.out.println("Hello World.")).start();
new WeddingCompany(new You()).happyMarry();
我们来看Thread类源码:
发现Thread类实现了 Runnable 接口。
这里发现WeddingCompany实现了Marry接口。
所以不难发现Thread的原理也是实现了代理。