Java内容观察者模式

在Java编程中,内容观察者模式(Observer Pattern)是一种非常常见的设计模式。它允许一个对象(称为主题)维护一系列依赖于它的对象(称为观察者),并在主题状态发生变化时自动通知观察者。这种模式被广泛应用于GUI编程、事件处理和数据驱动的应用程序中。

模式概述

观察者模式是一种行为型设计模式,它由以下角色组成:

  1. 主题(Subject):维护一系列观察者对象并提供注册、注销和通知观察者的方法。
  2. 观察者(Observer):定义了一个更新接口,使主题能够在状态改变时通知观察者。
  3. 具体主题(ConcreteSubject):继承或实现主题接口,并实现注册、注销和通知观察者的方法。
  4. 具体观察者(ConcreteObserver):继承或实现观察者接口,并实现更新方法以响应主题的状态变化。

示例场景

假设我们正在开发一个股票市场监控系统,我们希望当股票价格发生变化时,系统能够自动通知投资者。在这个场景中,股票市场就是主题,投资者就是观察者。

示例代码

首先,我们定义主题接口 Subject 和观察者接口 Observer

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

public interface Observer {
    void update(String stockName, double price);
}

接下来,我们实现具体主题类 StockMarket 和具体观察者类 Investor

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

public class StockMarket implements Subject {
    private List<Observer> observers;
    private String stockName;
    private double price;

    public StockMarket() {
        this.observers = new ArrayList<>();
    }

    public void setStockPrice(String stockName, double price) {
        this.stockName = stockName;
        this.price = price;
        notifyObservers();
    }

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

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

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

public class Investor implements Observer {
    private String name;

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

    @Override
    public void update(String stockName, double price) {
        System.out.println(name + " received update: " + stockName + " price changed to " + price);
    }
}

现在,我们可以编写一个测试类 Main 来演示使用观察者模式的股票市场监控系统。

public class Main {
    public static void main(String[] args) {
        StockMarket stockMarket = new StockMarket();

        Investor investor1 = new Investor("Alice");
        Investor investor2 = new Investor("Bob");

        stockMarket.registerObserver(investor1);
        stockMarket.registerObserver(investor2);

        stockMarket.setStockPrice("Apple", 150.0);
        stockMarket.setStockPrice("Google", 200.0);

        stockMarket.removeObserver(investor2);

        stockMarket.setStockPrice("Microsoft", 120.0);
    }
}

运行上述代码,我们将会看到以下输出:

Alice received update: Apple price changed to 150.0
Bob received update: Apple price changed to 150.0
Alice received update: Google price changed to 200.0
Bob received update: Google price changed to 200.0
Alice received update: Microsoft price changed to 120.0

从输出可以看出,当股票市场的股票价格发生变化时,投资者会收到相应的更新通知。

总结

观察者模式提供了一种松耦合的方式来实现主题和观察者之间的通信。它使得系统的不同部分能够独立地进行扩展和修改,而无需修改彼此之间的代码。