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...
  • 相关阅读:
    Linux中几种常用的查看文件内容的命令(file,cat,more,less,head,tail)
    Linux 链接文件讲解
    postgreSQL psql工具使用详解
    将Redhat,CentOS,Ubuntu虚拟机的IP设为静态IP的方法
    Hive中的Order by与关系型数据库中的order by语句的异同点
    Hadoop namenode节点无法启动的问题解决
    虚拟机上的Ubuntu 文件系统成为只读模式的解决办法
    Hive参数的临时设置和永久性设置
    hive动态分区和混合分区
    MongoDB之Linux下的安装
  • 原文地址:https://www.cnblogs.com/L-Test/p/14022206.html
Copyright © 2011-2022 走看看