✅什么是观察者模式,有哪些应用?

典型回答

观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式有助于实现松耦合,因为被观察者对象无需知道观察者的具体细节,只需通知它们即可。

观察者模式在许多应用场景中都能够发挥作用,特别是在需要处理对象之间的松耦合关系、实时通知和更新的情况下。以下是观察者模式常见的应用场景:

  1. 发布-订阅系统:观察者模式是发布-订阅模式的核心。当发布者发布新消息或事件时,所有订阅者都会收到通知并执行相应的操作。

  2. 事件处理机制:观察者模式用于处理事件驱动的编程。事件触发时,事件源对象会通知事件处理程序(观察者),以执行相应的操作。

  3. 实时数据更新:在需要实时更新数据的应用中,观察者模式可以用于将数据源与数据消费者连接起来。当数据源的数据发生变化时,观察者可以自动获取最新的数据并进行处理。

  4. 库和框架:许多编程库和框架使用观察者模式来支持插件和扩展。开发人员可以编写自定义观察者以响应库或框架中的事件或回调。

  5. 消息队列系统:观察者模式可用于消息队列系统,其中生产者将消息发送到队列,而消费者作为观察者订阅队列以接收和处理消息。

  6. 股票市场监测:股票市场应用程序可以使用观察者模式来监测股票价格变化,并将这些变化通知给投资者。

  7. 游戏开发:在游戏中,观察者模式可用于处理各种事件,如玩家输入、碰撞检测、角色状态变化等。

  8. 网络通信:在网络应用中,观察者模式可用于实现即时通信系统,其中用户之间的消息传递可以通过观察者模式来实现。

扩展知识

示例

我们先创建一个主题,然后期望他在被修改的时候可以被立刻感知到。

import java.util.ArrayList;
import java.util.List;

public class Subject {
    private List<Observer> observers = new ArrayList<>();
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        notifyAllObservers();
    }

    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void notifyAllObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }
}

这里面定义了一个成员变量List<Observer> observers,这就是这个主题的观察者的列表。Observer 的定义如下:

public interface Observer {
    void update();
}

可以定义一些具体的观察者实现:

public class ConcreteObserver implements Observer {
    private Subject subject;

    public ConcreteObserver(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Observer updated with new state: " + subject.getState());
    }
}

这样,我们就可以通过观察者模式来模拟主题变化时可以被观察者立即感知并做一些自己的操作:

public class ObserverPatternDemo {
    public static void main(String[] args) {
        Subject subject = new Subject();

        ConcreteObserver observer1 = new ConcreteObserver(subject);
        ConcreteObserver observer2 = new ConcreteObserver(subject);

        subject.setState(10); // 触发通知给观察者
    }
}

原文: https://www.yuque.com/hollis666/xkm7k3/aihkq1