观察者模式

观察者模式定义了一种一对多的依赖关系。当一个对象的状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。它通常用于事件处理系统,允许对象之间实现松耦合,便于扩展和维护。

观察者模式的结构

  1. Subject(主题/被观察者):管理所有的观察者对象,提供注册和删除观察者的方法。当自身状态改变时,它负责通知所有观察者。
  2. Observer(观察者):定义一个更新接口,用于接收来自被观察者的通知。
  3. ConcreteSubject(具体主题):具体的被观察者对象,状态发生变化时通知观察者。
  4. ConcreteObserver(具体观察者):具体的观察者对象,实现了观察者接口,并在接收到通知时做出反应。

举例

假设我们有一个股票市场系统,股票价格变动时需要通知所有的投资者。我们可以用观察者模式来实现这个场景。

package com.example.demo.demos.test;
import java.util.ArrayList;
import java.util.List;

public class test01 {
    public static void main(String[] args) {
        Stock stock = new Stock();
        Investor investor1 = new Investor("Alice");
        Investor investor2 = new Investor("Bob");
        Investor investor3 = new Investor("Charlie");

        stock.registerObserver(investor1);
        stock.registerObserver(investor2);
        stock.registerObserver(investor3);

        stock.setPrice(120.0f);
        stock.removeObserver(investor2);
        stock.setPrice(130.0f);
    }
}

interface Observer{
    void update(float price);
}

interface Subject{
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers();
}

class Stock implements Subject{
    private List<Observer> observers ;
    private float price;

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

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

    @Override
    public void removeObserver(Observer o) {
        observers.remove(o);
    }

    @Override
    public void notifyObservers() {
        for(Observer o: observers){
            o.update(price);
        }
    }

    public void setPrice(float price){
        this.price = price;
        notifyObservers();
    }


}

class Investor implements Observer{
    private String name;

    public Investor(String name){
        this.name = name;
    }

    @Override
    public void update(float price) {
        System.out.printf("%s: The stock price has changed to %.2f%n", name, price);
    }
}

输出结果如下:

Alice: The stock price has changed to 120.00
Bob: The stock price has changed to 120.00
Charlie: The stock price has changed to 120.00
Alice: The stock price has changed to 130.00
Charlie: The stock price has changed to 130.00
最后修改:2024 年 10 月 10 日
如果觉得我的文章对你有用,请随意赞赏