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

一、什么是观察者模式

观察者模式(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接口,开发者可以轻松地实现这一模式,从而提高代码的模块化和可维护性。

相关推荐
程序猿阿伟1 分钟前
《C++中的魔法:实现类似 Python 的装饰器模式》
java·c++·装饰器模式
Mr. zhihao3 分钟前
装饰器模式详解:动态扩展对象功能的优雅解决方案
java·开发语言·装饰器模式
Slow菜鸟5 分钟前
Spring 设计模式之装饰器模式
spring·设计模式·装饰器模式
zzzhpzhpzzz5 分钟前
设计模式——装饰器模式
设计模式·装饰器模式
2401_8576009510 分钟前
商场应急管理:SpringBoot技术解决方案
java·spring boot·后端
想做白天梦22 分钟前
多级反馈队列
java·windows·算法
潇雷24 分钟前
算法Day12|226-翻转二叉树;101-对称二叉树;104-二叉树最大深度;111-二叉树最小深度
java·算法·leetcode
一颗甜苞谷31 分钟前
开源一套基于若依的wms仓库管理系统,支持lodop和网页打印入库单、出库单的源码
java·开源
半夏之沫33 分钟前
✨最新金九银十✨大厂后端面经✨
java·后端·面试