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 命令终端提示符显示-bash-4.1#解决方法
    实践过配置成功的VNC安装配置
    技术团队新官上任之中层篇
    技术团队新官上任之基层篇
    代码可维护性的神秘面纱
    程序员,如何在工作中崭露头角?
    centos 安装git
    防火墙 -- centos7默认的firewalld
    防火墙 --Ubuntu的ufw工具
    golang的跨平台编译
  • 原文地址:https://www.cnblogs.com/L-Test/p/14022206.html
Copyright © 2011-2022 走看看