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...
  • 相关阅读:
    HDU 4611 Balls Rearrangement 数学
    Educational Codeforces Round 11 D. Number of Parallelograms 暴力
    Knockout.Js官网学习(简介)
    Entity Framework 关系约束配置
    Entity Framework Fluent API
    Entity Framework DataAnnotations
    Entity Framework 系统约定配置
    Entity Framework 自动生成CodeFirst代码
    Entity Framework CodeFirst数据迁移
    Entity Framework CodeFirst尝试
  • 原文地址:https://www.cnblogs.com/L-Test/p/14022206.html
Copyright © 2011-2022 走看看