行为型模式之观察者模式

观察者模式(Observer Pattern)

观察者模式是一种行为设计模式,用于建立对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会自动收到通知并更新。
在观察者模式中,有两类角色:被观察者(也称为主题或可观察者)和观察者。

被观察者维护了一个观察者列表,并提供了注册、注销和通知观察者的方法。观察者通过注册自己来订阅被观察者的状态变化。

当被观察者的状态发生改变时,它会遍历观察者列表并调用各个观察者的相应方法来通知它们。
观察者模式的优点包括松耦合、可扩展性好,被观察者与观察者之间的关系可以动态建立和解除。它常被用于事件驱动系统,

例如GUI界面的事件处理、发布-订阅模式等。

需要注意的是,在具体实现观察者模式时,要确保避免循环引用和过度依赖观察者之间的耦合。

提供demo版代码更容易理解

java 复制代码
/**
 * @author zhou
 *  观察者接口
 */
interface Observer {
    void update(String data);
}

/**
 * @author zhou
 *  被观察者接口
 */
interface Observable {
    // 注册
    void registerObserver(Observer observer);
    // 注销
    void unregisterObserver(Observer observer);
    // 通知
    void notifyObservers(String data);
}

/**
 * @author zhou
 *  具体的观察者类
 */
class ConcreteObserver implements Observer {
    @Override
    public void update(String data) {
        System.out.println("Received data: " + data);
    }
}

/**
 * @author zhou
 *  具体的被观察者类
 */
class ConcreteObservable implements Observable {
    private List<Observer> observers;

    public ConcreteObservable() {
        observers = new ArrayList<>();
    }

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void unregisterObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers(String data) {
        for (Observer observer : observers) {
            observer.update(data);
        }
    }

    public void doSomething() {
        // 做一些操作...
        String data = "Some data";
        notifyObservers(data);
    }
}

/**
 * @author zhou
 *  客户端使用
 */
public class Main {
    public static void main(String[] args) {
        ConcreteObservable observable = new ConcreteObservable();
        Observer observer1 = new ConcreteObserver();
        Observer observer2 = new ConcreteObserver();

        // 注册观察者
        observable.registerObserver(observer1);
        observable.registerObserver(observer2);

        // 调用被观察者的方法,会通知观察者并执行相应的更新操作
        observable.doSomething();

        // 取消注册一个观察者
        observable.unregisterObserver(observer2);

        // 再次调用被观察者的方法
        observable.doSomething();
    }
}

在这个示例中,Observer 接口是观察者的接口,其中定义了 update 方法来接收被观察者传递的数据。

Observable 接口是被观察者的接口,其中包含了注册、注销和通知观察者的方法。

ConcreteObserver 类是具体的观察者类,实现了 Observer 接口的 update 方法,用于处理被观察者传递的数据。

ConcreteObservable 类是具体的被观察者类,实现了 Observable 接口的方法。

它内部维护了一个观察者列表,并在操作时调用 notifyObservers 方法通知所有注册的观察者。
在示例的 Main 类中,首先创建了一个具体的被观察者对象 observable,

然后创建了多个具体的观察者对象 (observer1 和 observer2),并将它们注册到被观察者对象中。

随后调用被观察者的 doSomething 方法,触发通知过程,观察者接收到数据并进行相应的更新操作。

相关推荐
weixin_727535621 分钟前
MinIO大文件上传深度拆解:从原理到生产落地的完整指南
java·中间件
Lyndon-李大鹏27 分钟前
QT-VS环境
开发语言·qt
摇滚侠40 分钟前
Java 全栈开发实战教程 课程笔记 34-36
java·笔记
芝士熊爱编程1 小时前
创建型模式-单例模式
java·单例模式·设计模式
大模型码小白1 小时前
Spring AI 框架实战:Java 后端集成大模型的架构设计与工程落地
java·人工智能·python·spring
微学AI1 小时前
内网穿透的应用-把飞牛NAS变成家庭录像中心:EasyNVR部署与远程回放实战
开发语言·php
峥嵘life1 小时前
Android WiFi连接过程 wpa_supplicant 日志分析
android·开发语言·php
BerryS3N1 小时前
深度解析:从零构建生产级大模型 RAG(检索增强生成)系统全栈指南
开发语言·python·ai
weixin_BYSJ19871 小时前
「课设设计」springboot校园超市助购系统26449 (附源码)
java·javascript·spring boot·python·django·flask·php
栋***t1 小时前
从“纸质试卷”到“AI智能组卷”,麦塔在线考试系统如何重构出题逻辑?
java·大数据·人工智能·算法·重构