设计模式之 ==> 观察者计模式

一、什么是观察者设计模式

先来看一下下面的定义:

  观察者模式(Observe Pattern)定义对象之间的一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

自己的理解:

  除了上面描述的定义,观察者设计模式还可以用于一个流程的数据获取,或者一系列数据的校验,下面我们来举几个例子。

二、场景一

场景描述:有一个数据校验的需求,需要分别从MySQL、Redis、Kafka、数据文件中获取数据进行校验,各类校验逻辑处理不同。

首先,我们来定义一个抽象观察者的接口

public interface IObserver {

  void check();
}

接下来我们来定义具体的观察者,即:MySQL、Redis、Kafka、数据文件等各类校验

public class MysqlCheckObserver implements IObserver {

  @Override
  public void check() {
    System.out.println("Mysql check...");
  }
}
MysqlCheckObserver
public class RedisCheckObserver implements IObserver {

  @Override
  public void check() {
    System.out.println("Redis check...");
  }
}
RedisCheckObserver
public class KafkaCheckObserver implements IObserver {

  @Override
  public void check() {
    System.out.println("Kafka check...");
  }
}
KafkaCheckObserver
public class FileCheckObserver implements IObserver{

  @Override
  public void check() {
    System.out.println("File check...");
  }
}
FileCheckObserver

以上四个类代表具体的观察者,只是简写,没有具体逻辑

再来是最关键的通知者类

public enum ObserverManager {

  /**
   * 枚举单例
   */
  newInstance;

  private final List<IObserver> observers;

  ObserverManager() {
    this.observers = Lists.newArrayList(
            new MysqlCheckObserver(),
            new FileCheckObserver(),
            new RedisCheckObserver(),
            new KafkaCheckObserver());
  }

  public void doCheck() {
    for (IObserver observer : this.observers) {
      observer.check();
    }
  }
}

通知者类初始化后将所有观察者放入一个 List 当中,然后循环执行每个通知者当中的 check() 方法,即具体的逻辑处理,如果对顺序有要求,则通知者按照顺序放,执行校验时就会按照顺序执行。

最后来看一下调用和执行结果

public class App {

  public static void main(String[] args) {
    ObserverManager.newInstance.doCheck();
  }
}

// Mysql check...
// File check...
// Redis check...
// Kafka check...
原文地址:https://www.cnblogs.com/L-Test/p/14022206.html