设计模式之 ==> 观察者计模式
一、什么是观察者设计模式
先来看一下下面的定义:
观察者模式(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..."); } }
public class RedisCheckObserver implements IObserver { @Override public void check() { System.out.println("Redis check..."); } }
public class KafkaCheckObserver implements IObserver { @Override public void check() { System.out.println("Kafka check..."); } }
public class FileCheckObserver implements IObserver{ @Override public void check() { System.out.println("File check..."); } }
以上四个类代表具体的观察者,只是简写,没有具体逻辑
再来是最关键的通知者类
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...