观察者模式

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();
}

results matching ""

    No results matching ""