design pattern · 2023-12-31 0

Java设计模式-观察者模式

一、概述

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

二、角色

  • 主题(Subject):也称为被观察者或可观察者,它是具有状态的对象,并维护着一个观察者列表。主题提供了添加、删除和通知观察者的方法。

  • 观察者(Observer):观察者是接收主题通知的对象。观察者需要实现一个更新方法,当收到主题的通知时,调用该方法进行更新操作。

  • 具体主题(Concrete Subject):具体主题是主题的具体实现类。它维护着观察者列表,并在状态发生改变时通知观察者。

  • 具体观察者(Concrete Observer):具体观察者是观察者的具体实现类。它实现了更新方法,定义了在收到主题通知时需要执行的具体操作。

三、观察者模式

1.主体

被观察者

Java 自带的 Observable 类

java.util.Observable.java

2.观察者

Java 自带的 Observer 类

java.util.Observer.java

3.具体主体

public class WeatherStation extends Observable {

    public void updateTemperature(float temperature) {
        // 必须调用 setChanged() 才能通知
        setChanged();
        // 推送数据给所有观察者
        notifyObservers(temperature);
    }
}

4.具体观察者

public class PhoneDisplay implements Observer {

    @Override
    public void update(Observable obs, Object arg) {
        if (obs instanceof WeatherStation) {
            float temp = (float) arg;
            System.out.println("手机显示: 天气更新,当前温度 = " + temp + "°C");
        }
    }
}
public class WebDisplay implements Observer {

    @Override
    public void update(Observable obs, Object arg) {
        if (obs instanceof WeatherStation) {
            float temp = (float) arg;
            System.out.println("网页显示: 温度已更新为 " + temp + "°C");
        }
    }
}

5.测试

@Test
public void testObserver() {
    // 创建被观察者
    WeatherStation station = new WeatherStation();

    // 创建观察者
    PhoneDisplay phone = new PhoneDisplay();
    WebDisplay web = new WebDisplay();

    // 注册观察者
    station.addObserver(phone);
    station.addObserver(web);

    // 模拟温度变化
    station.updateTemperature(25.5f);
    station.updateTemperature(27.0f);
}

结果:

网页显示: 温度已更新为 25.5°C
手机显示: 天气更新,当前温度 = 25.5°C
网页显示: 温度已更新为 27.0°C
手机显示: 天气更新,当前温度 = 27.0°C