静态代理模式
静态代理是多线程底部的原理,在 Java 中线程的设计就使用了静态代理设计模式,其中自定义线程类及Thread
类都是实现了Runnable
接口。
在创建子线程的时候,传入了自定义线程类的引用,再通过调用start()
方法,调用自定义线程对象的run()
方法。实现了线程的并发执行。
概要
- 真实对象和代理对象都要实现同一个接口
- 代理对象要代理真实角色
- 真实对象只专注于自己的功能,代理对象可以帮忙做其他的事
步骤
- 定义抽象接口
- 定义真实对象的类
- 定义代理对象的类
- 通过代理对象调用实现方法
示例
public class StaticProxy {
public static void main(String[] args) {
Wedding wedding = new Wedding(new You());
wedding.happyMarry();
}
}
interface Marry {
void happyMarry();
}
// 真实角色,结婚的人是你
class You implements Marry {
@Override
public void happyMarry() {
System.out.println("你要结婚了");
}
}
// 代理角色,帮助目标结婚
class Wedding implements Marry {
// 代理目标,即真实角色
private Marry target;
public Wedding(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("结婚后,收尾款");
}
}
对比
将上述示例中的执行代码
Wedding wedding = new Wedding(new You());
wedding.happyMarry();
精简后可得:
new Wedding(new You()).happyMarry();
而创建一个线程的代码
new Thread(new Runnable() {...}).start();
(简化为 lambda 表达式后):
new Thread(() -> ...).start();
正好与之对应,即new 代理(new 真实).实现方法()