静态代理
真实对象和代理对象都要实现同一个接口
代理对象要代理真实对象
代理对象可以做很多真实对象做不了的事情
真实对象专注于自己的事情
1. 婚礼示例
- 你:真实角色
- 婚庆公司:代理你,帮你处理结婚的各种事情
- 结婚:实现结婚接口
/**
* @ClassName Demo1
* @Description 静态代理:结婚示例
* @Author wangwk-a
* @Date 2022/1/1 19:15
* @Version 1.0
*/
public class Demo1 {
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() {
beforeMarry();
this.target.happyMarry();
afterMarry();
}
private void afterMarry() {
System.out.println("婚后收尾款");
}
private void beforeMarry() {
System.out.println("婚前布置婚礼现场");
}
}
婚前布置婚礼现场
我要结婚啦
婚后收尾款
Process finished with exit code 0
2. Runnable接口使用与静态代理
使用实现Runnable接口来进行多线程的方式时,需要编写一个自己的线程类实现Runnable接口:
在调用的时候,需要通过Thread类来调用:
实际上,Thread类就是一个代理类,它也实现了Runnable接口:
这样的话,我们自己写的线程类就是真实角色,Thread代理角色通过构造函数来代理真实角色: