Java设计模式开发中使用观察者模式的实例教程
观察者模式是一种行为型设计模式,它允许对象之间建立一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会得到通知并自动更新。在Java设计模式开发中,观察者模式被广泛应用于事件驱动系统、GUI开发和消息通知等场景。
实现观察者模式的基本步骤
- 定义主题接口(Subject):主题是被观察的对象,它需要提供注册观察者、移除观察者和通知观察者的方法。
- 实现具体主题类(ConcreteSubject):具体主题类实现主题接口,维护一个观察者列表,并在状态发生变化时通知观察者。
- 定义观察者接口(Observer):观察者是接收主题通知的对象,它需要提供更新方法。
- 实现具体观察者类(ConcreteObserver):具体观察者类实现观察者接口,当接收到主题通知时执行相应的更新操作。
示例1:气象站
假设我们正在开发一个气象站应用程序,需要实时显示当前的温度、湿度和气压。我们可以使用观察者模式来实现这个功能。
首先,我们定义主题接口(Subject):
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
然后,实现具体主题类(WeatherStation):
import java.util.ArrayList;
import java.util.List;
public class WeatherStation implements Subject {
private List<Observer> observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherStation() {
observers = new ArrayList<>();
}
public void registerObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(temperature, humidity, pressure);
}
}
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
notifyObservers();
}
}
接下来,定义观察者接口(Observer):
public interface Observer {
void update(float temperature, float humidity, float pressure);
}
最后,实现具体观察者类(Display):
public class Display implements Observer {
private float temperature;
private float humidity;
private float pressure;
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
display();
}
public void display() {
System.out.println(\"Current conditions: \" + temperature + \"F degrees, \" + humidity + \"% humidity, \" + pressure + \" pressure\");
}
}
现在,我们可以使用观察者模式来创建一个气象站应用程序:
public class WeatherApp {
public static void main(String[] args) {
WeatherStation weatherStation = new WeatherStation();
Display display = new Display();
weatherStation.registerObserver(display);
// 模拟气象数据更新
weatherStation.setMeasurements(75, 60, 30.4f);
}
}
运行上述代码,输出结果为:
Current conditions: 75.0F degrees, 60.0% humidity, 30.4 pressure
示例2:股票市场
假设我们正在开发一个股票市场监控系统,需要实时监测股票价格的变化并通知相关的观察者。我们可以使用观察者模式来实现这个功能。
首先,定义主题接口(Subject)和观察者接口(Observer)与示例1中相同。
然后,实现具体主题类(StockMarket):
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() {
observers = new ArrayList<>();
}
public void registerObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(stockName, price);
}
}
public void setStockPrice(String stockName, double price) {
this.stockName = stockName;
this.price = price;
notifyObservers();
}
}
接下来,实现具体观察者类(Investor):
public class Investor implements Observer {
private String name;
public Investor(String name) {
this.name = name;
}
public void update(String stockName, double price) {
System.out.println(name + \" received update: \" + stockName + \" price is \" + price);
}
}
最后,我们可以使用观察者模式来创建一个股票市场监控系统:
public class StockMarketApp {
public static void main(String[] args) {
StockMarket stockMarket = new StockMarket();
Investor investor1 = new Investor(\"John\");
Investor investor2 = new Investor(\"Alice\");
stockMarket.registerObserver(investor1);
stockMarket.registerObserver(investor2);
// 模拟股票价格变化
stockMarket.setStockPrice(\"AAPL\", 150.0);
}
}
运行上述代码,输出结果为:
John received update: AAPL price is 150.0
Alice received update: AAPL price is 150.0
通过以上两个示例,我们可以看到观察者模式的应用。它可以帮助我们实现对象之间的松耦合,使得主题和观察者可以独立变化,同时也提供了一种简单的方式来实现事件驱动的系统。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java设计模式开发中使用观察者模式的实例教程 - Python技术站