Java观察者模式是一种重要的设计模式,它在许多Java应用程序中发挥着关键作用,本文将深入剖析其原理、应用场景并给出实例。

一、Java观察者模式原理

1. 基本概念

  • 在Java观察者模式中,有两个主要角色:被观察者(Subject)和观察者(Observer)。被观察者是一个对象,它的状态可能会发生改变;观察者是关注被观察者状态变化的对象。可以类比为新闻发布者(被观察者)和新闻订阅者(观察者)。新闻发布者的状态(如发布了新的新闻内容)发生变化时,新闻订阅者会得到通知。
  • 被观察者维护着一个观察者的列表。当被观察者的状态发生改变时,它会遍历这个列表,通知所有的观察者。
  • 2. 代码实现原理

  • 在Java中,被观察者通常是一个类,它包含了添加观察者、移除观察者和通知观察者的方法。例如:
  • java

    import java.util.ArrayList;

    import java.util.List;

    class Subject {

    private List observers = new ArrayList<>;

    private int state;

    public int getState {

    return state;

    public void setState(int state) {

    this.state = state;

    notifyObservers;

    public void addObserver(Observer observer) {

    observers.add(observer);

    public void removeObserver(Observer observer) {

    深入探究Java观察者:原理、应用与实例

    observers.remove(observer);

    public void notifyObservers {

    for (Observer observer : observers) {

    observer.update(this);

  • 观察者是一个接口或者抽象类,它定义了一个update方法,当被观察者通知观察者时,会调用这个方法。例如:
  • java

    interface Observer {

    void update(Subject subject);

    二、Java观察者模式的应用

    1. 图形用户界面(GUI)开发

  • 在GUI应用中,用户界面组件之间经常需要相互通信。例如,一个按钮(被观察者)的点击状态改变时,可能需要通知与之相关的其他组件(观察者)做出相应的反应。
  • 比如,当一个“提交”按钮被点击(状态改变),与之关联的文本框可能需要被清空(观察者的反应),或者相关的提示信息需要显示。这种情况下,观察者模式可以很好地实现组件之间的松耦合通信,使得代码更易于维护和扩展。
  • 2. 事件处理系统

  • 在许多应用中,存在各种各样的事件,如鼠标点击事件、键盘输入事件等。可以将事件源(如鼠标、键盘)看作被观察者,而处理这些事件的程序部分看作观察者。
  • 当鼠标点击(被观察者状态改变)时,注册了该鼠标点击事件的处理程序(观察者)就会被通知并执行相应的操作,比如打开一个菜单或者选中一个图标。
  • 3. 股票市场监测系统

  • 假设我们有一个股票市场数据提供系统(被观察者),它不断更新股票的价格、成交量等信息。而有许多投资者或者分析软件(观察者)关注这些股票数据的变化。
  • 每当股票数据发生变化时,股票市场数据提供系统就会通知所有关注该股票的投资者或分析软件,以便他们根据新的数据进行决策,如买卖股票或者重新评估投资组合。
  • 三、Java观察者模式的实例

    1. 简单的温度监测系统

  • 我们创建一个温度传感器类作为被观察者。它会不断读取温度值,当温度值发生变化时,通知关注温度变化的观察者。
  • 定义被观察者(温度传感器)类:
  • java

    class TemperatureSensor extends Subject {

    private double temperature;

    public double getTemperature {

    return temperature;

    深入探究Java观察者:原理、应用与实例

    public void setTemperature(double temperature) {

    this.temperature = temperature;

    setState((int) temperature);

  • 然后,定义观察者类,例如一个显示温度的显示器和一个温度过高报警装置:
  • java

    class TemperatureDisplay implements Observer {

    @Override

    public void update(Subject subject) {

    if (subject instanceof TemperatureSensor) {

    TemperatureSensor sensor = (TemperatureSensor) subject;

    System.out.println("当前温度为: " + sensor.getTemperature + "℃");

    class TemperatureAlarm implements Observer {

    @Override

    public void update(Subject subject) {

    if (subject instanceof TemperatureSensor) {

    TemperatureSensor sensor = (TemperatureSensor) subject;

    if (sensor.getTemperature > 30) {

    System.out.println("温度过高,报警!");

  • 在主程序中,我们创建温度传感器对象,添加观察者,然后模拟温度变化:
  • java

    public class Main {

    public static void main(String[] args) {

    TemperatureSensor sensor = new TemperatureSensor;

    TemperatureDisplay display = new TemperatureDisplay;

    TemperatureAlarm alarm = new TemperatureAlarm;

    sensor.addObserver(display);

    sensor.addObserver(alarm);

    sensor.setTemperature(25);

    sensor.setTemperature(35);

    Java观察者模式是一种非常有用的设计模式,它在不同的领域有着广泛的应用。通过理解其原理,我们可以更好地在Java编程中运用它来实现对象之间的松耦合通信,提高代码的可维护性和扩展性。