观察者模式
1. 使用场景
需要在某一特定时机,对现有流程补充和扩展时。
2. 实现举例
在spring这样的容器中,经常需要对创建出来的bean进行后处理,如将某个bean替换为代理对象这样的操作。
由于spring也不能预料到将来需要为该bean进行哪些后处理
操作,所以需要将后处理
操作进行抽象,并在特定的地点(bean被创建后)来执行这些后处理
操作。
// 为了在某个bean创建后,对该bean进行后处理
interface BeanPostProcessor {
// 后处理操作的抽象
Object postProcess(Object bean);
}
// 容器类
class Container {
// 保存所有后处理器
List<BeanPostProcessor> bpps = new ArrayList<>();
// 注册(添加)后处理器
public Container register(List<BeanPostProcessor> bpps) {
this.bpps = bpps;
return this;
}
// 创建bean,并执行所有后处理操作
public Object createBean() {
System.out.println("创建某个bean");
Object bean = new Object();
// 在这里调用所有后处理器
for (BeanPostProcessor bpp : bpps) {
bean = bpp.postProcess(bean);
}
return bean;
}
}
使用示例:
public static void main(String[] args) {
BeanPostProcessor bpp1 = (bean) -> {
System.out.println("进行后处理1...");
return bean;
};
BeanPostProcessor bpp2 = (bean) -> {
System.out.println("进行后处理2...");
return bean;
};
Container c = new Container().register(Arrays.asList(bpp1, bpp2));
c.createBean();
}