详细讲解什么是观察者模式

        观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生变化时,所有依赖于它的观察者都会得到通知并自动更新。

该模式主要涉及两种角色:

  1. 主题(Subject): 也称为被观察者或可观察对象,是目标对象。它包含一系列观察者,并提供方法来添加、删除观察者以及通知观察者的操作。

  2. 观察者(Observer): 也称为订阅者,它定义了一个更新的接口,用于主题在状态发生变化时通知观察者。

        观察者模式的核心思想是解除主题和观察者之间的耦合关系,使得它们可以独立变化。当主题的状态发生变化时,所有的观察者都能够及时得到通知,并进行相应的处理。

        下面是一个简单的观察者模式的例子,假设我们有一个气象站,它可以实时测量温度,并通知多个观察者:

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

// 主题接口
interface Subject {
    void addObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// 观察者接口
interface Observer {
    void update(float temperature);
}

// 具体主题
class WeatherStation implements Subject {
    private List observers = new ArrayList<>();
    private float temperature;

    public void setTemperature(float temperature) {
        this.temperature = temperature;
        notifyObservers();
    }

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

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

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

// 具体观察者
class Display implements Observer {
    private float temperature;

    @Override
    public void update(float temperature) {
        this.temperature = temperature;
        display();
    }

    public void display() {
        System.out.println("Current Temperature: " + temperature);
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        WeatherStation weatherStation = new WeatherStation();

        Display display1 = new Display();
        Display display2 = new Display();

        weatherStation.addObserver(display1);
        weatherStation.addObserver(display2);

        // 模拟温度变化
        weatherStation.setTemperature(25.5f);
        weatherStation.setTemperature(28.0f);
    }
}

        在这个例子中,WeatherStation 是具体主题,实现了 Subject 接口。Display 是具体观察者,实现了 Observer 接口。客户端通过调用 addObserver 方法将观察者注册到主题中,然后通过 setTemperature 方法模拟温度的变化,观察者会收到通知并更新自己的状态。

你可能感兴趣的:(设计模式,观察者模式,java)