zoukankan      html  css  js  c++  java
  • 设计模式之 ==> 观察者计模式

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

    先来看一下下面的定义:

      观察者模式(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...
  • 相关阅读:
    PHP 多参数方法的重构
    PHP cURL库函数抓取页面内容
    PHP下载远程文件到指定目录
    PHP生成特定长度的纯字母字符串
    PHP提取奇数或偶数下标元素
    Java中的clone()----深复制,浅复制
    LeetCode题解 343.Integer Break
    MySQL学习笔记(四):存储引擎的选择
    存储过程优缺点
    MySQL学习笔记(三):常用函数
  • 原文地址:https://www.cnblogs.com/L-Test/p/14022206.html
Copyright © 2011-2022 走看看