• 设计模式 -- 观察者模式


    说明

    1. @author blog.jellyfishmix.com / JellyfishMIX - github
    2. LICENSE GPL-2.0

    定义

    观察者模式(Observer Design Pattern) 也被称为发布订阅模式(Publish-Subscribe Design Pattern)。在 GoF 的《设计模式》一书中,它的定义是这样的:

    Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

    中文翻译: 在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。

    从模型来讲,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者(Observer)。不过,在实际的项目开发中,这两种对象的称呼是比较灵活的,有各种不同的叫法,比如: Subject-Observer, Publisher-Subscriber, Producer-Consumer, EventEmitter-EventListener, Dispatcher-Listener。不管怎么称呼,只要应用场景符合定义,都可以看作观察者模式。

    从定义中可以知道,观察者模式主要应用于通知的场景,并且通知的主题可能会频繁的改变。观察者模式可以解耦被观察者与观察者。

    观察者接口

    定义了观察者感知消息的能力。

    public interface Observer {
      void update(Message message);
    }
    
    • 1
    • 2
    • 3

    主题

    定义了操作观察者的能力。

    public interface Subject {
      void registerObserver(Observer observer);
      void removeObserver(Observer observer);
      void notifyObservers(Message message);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    主题实现

    实现了操作观察者的能力。

    public class ConcreteSubject implements Subject {
      private List<Observer> observers = new ArrayList<Observer>();
    
      @Override
      public void registerObserver(Observer observer) {
        observers.add(observer);
      }
    
      @Override
      public void removeObserver(Observer observer) {
        observers.remove(observer);
      }
    
      @Override
      public void notifyObservers(Message message) {
        for (Observer observer : observers) {
          observer.update(message);
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    观察者实现

    实现了观察者感知消息的逻辑。

    public class ConcreteObserverA implements Observer {
      @Override
      public void update(Message message) {
        // do something 获取消息通知后,执行观察者的自定义逻辑
        System.out.println("ConcreteObserverA is notified.");
      }
    }
    
    public class ConcreteObserverB implements Observer {
      @Override
      public void update(Message message) {
        // do something 获取消息通知后,执行观察者的自定义逻辑
        System.out.println("ConcreteObserverOne is notified.");
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    demo

    1. 实例化一个主题,向主题注册多个观察者,触发主题通知观察者。
    public class Demo {
      public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        subject.registerObserver(new ConcreteObserverA());
        subject.registerObserver(new ConcreteObserverB());
        subject.notifyObservers(new Message());
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    【开源】基于Vue和SpringBoot的生活废品回收系统
    前端常用的开发工具有哪些?
    【scala】阶段性练习
    【深度学习 | 核心概念】那些深度学习路上必经的核心概念,确定不来看看? (五)
    数据可视化设计经验分享:10分钟做出炫酷数据大屏
    浅浅理解.net core的路由
    深度好文:How to get started in C++!
    优思学院|六西格玛将烹饪和美味提升至极致
    网站TDK采集工具-网站的TDK设置方法
    SQL中IN和EXSIST的区别
  • 原文地址:https://blog.csdn.net/weixin_43735348/article/details/134323998