【设计模式系列】观察者模式

一、什么是观察者模式

观察者模式(Observer Pattern)是一种行为设计模式,++它定义了对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新++。这种模式也被称为发布-订阅模式,其中对象(主题)维护一个依赖于它的观察者列表,并且在其状态变化时通知它们。

二、观察者模式的角色

  1. Subject(主题)

    • 也被称为Observable,它是观察者模式的核心。主题包含观察者列表,并为观察者提供注册(订阅)、注销(取消订阅)和通知的方法。
    • 它有两种形式:抽象主题和具体主题。抽象主题提供一个接口,定义了管理观察者的方法,而具体主题实现了这个接口,并在状态变化时通知所有观察者。
  2. Observer(观察者)

    • 观察者定义了一个更新接口,该接口在被观察者状态变化时会被调用。这个接口通常包含一个update()方法,它接收一个参数,该参数通常是主题对象的引用。
  3. ConcreteSubject(具体主题)

    • 具体主题是主题的一个实现,它包含状态信息,并且在状态变化时负责通知所有注册的观察者。
  4. ConcreteObserver(具体观察者)

    • 具体观察者实现了观察者接口,并在update()方法中定义了接收到通知后的具体逻辑。

三、观察者模式的典型应用场景

  1. 事件处理系统:许多编程框架和库使用观察者模式来实现事件处理机制,允许对象在状态变化时通知其他对象。

  2. 缓存系统:缓存数据时,如果底层数据发生变化,缓存系统需要通知依赖这些数据的应用或服务。

  3. 配置管理和服务发现:在微服务架构中,服务的注册和发现机制常常使用观察者模式,以确保服务的变化能够及时通知到其他服务。

四、观察者模式在Observer中的应用

在Java中,Observer类和Observable类是观察者模式的典型实现,它们提供了一种实现对象间一对多依赖关系的方式。以下是Observer类和Observable类在观察者模式中的应用:

  1. Observable类

    • Observable类充当抽象主题(Subject)的角色,它维护了一个观察者(Observer)对象的列表,并且提供了方法来添加(addObserver)、删除(deleteObserver)观察者以及通知(notifyObservers)所有观察者。
  2. Observer接口

    • Observer接口定义了观察者必须实现的update方法,该方法将在被观察对象(Observable对象)的状态发生改变时被调用。

    import java.util.Observable;
    import java.util.Observer;

    // 具体观察者
    class ConcreteObserver implements Observer {
    @Override
    public void update(Observable o, Object arg) {
    System.out.println("Observer received update: " + arg);
    }
    }

    // 具体主题
    class ConcreteObservable extends Observable {
    private int counter;

     public void increment() {
         counter++;
         setChanged(); // 标记状态改变
         notifyObservers(counter); // 通知观察者
     }
    

    }

    public class ObserverPatternDemo {
    public static void main(String[] args) {
    ConcreteObservable observable = new ConcreteObservable();
    ConcreteObserver observer = new ConcreteObserver();

         observable.addObserver(observer); // 注册观察者
    
         // 模拟状态变更
         observable.increment();
         observable.increment();
     }
    

    }

在这个示例中,ConcreteObservable类继承了Observable类,表示被观察的主题,它有一个increment方法来模拟状态的变更。每次调用increment方法时,都会通知所有注册的观察者(ConcreteObserver实例)。观察者通过实现Observer接口的update方法来接收更新。

观察者模式在Java中的应用非常广泛,特别是在需要实现动态通知和更新的场景中。通过使用Observable类和Observer接口,开发者可以轻松地实现这一模式,从而提高代码的模块化和可维护性。

相关推荐
潜洋15 分钟前
Spring Boot教程之五:在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序
java·spring boot·后端
暮志未晚Webgl34 分钟前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
小叶lr1 小时前
idea 配置 leetcode插件 代码模版
java·leetcode·intellij-idea
qq_429856571 小时前
idea启动服务报错Application run failed
java·ide·intellij-idea
瑞雨溪1 小时前
java中的this关键字
java·开发语言
J不A秃V头A1 小时前
Redisson 中开启看门狗(watchdog)机制
java·分布式锁·看门狗
草字1 小时前
uniapp input限制输入负数,以及保留小数点两位.
java·前端·uni-app
李迟1 小时前
某Linux发行版本无法使用nodejs程序重命名文件问题的研究
java·linux·服务器
MapleLea1f1 小时前
26届JAVA 学习日记——Day14
java·开发语言·学习·tcp/ip·程序人生·学习方法
没有黑科技2 小时前
基于web的音乐网站(Java+SpringBoot+Mysql)
java·前端·spring boot