赞
踩
观察者模式(Observer Pattern)是行为型设计模式之一,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
在Java中,观察者模式通常通过java.util.Observable类和java.util.Observer接口实现,但是由于Observable类的方法都是同步的,可能会影响程序的灵活性和并发性,因此在Java 1.0版本之后,推荐使用Java.util.concurrent包下的BlockingQueue作为替代方案。
在Java中,观察者模式通常涉及到以下几个角色:
目标是被观察的对象。它提供了添加、删除观察者的接口,并在自身内部状态改变时通知观察者。
观察者接口定义了一个更新方法,当目标的状态发生改变时,观察者会接收到通知并调用这个方法。
实现了Subject的具体类,包含有关状态的通知方法。
实现了Observer接口的具体类,包含一个更新方法,当收到通知时会执行这个方法。
观察者模式的应用场景非常广泛,主要包括:
观察者模式是发布-订阅模式的核心。当发布者发布新消息或事件时,所有订阅者都会收到通知并执行相应的操作。
观察者模式用于处理事件驱动的编程。事件触发时,事件源对象会通知事件处理程序(观察者),以执行相应的操作。
在需要实时更新数据的应用中,观察者模式可以用于将数据源与数据消费者连接起来。当数据源的数据发生变化时,观察者可以自动获取最新的数据进行处理。
许多编程库和框架使用观察者模式来支持插件和扩展。开发人员可以编写自定义观察者以响应库或框架中的事件或回调。
观察者模式可用于消息队列系统,其中生产者将消息发送到队列,而消费者作为观察者订阅队列以接收和处理消息。
股票市场应用程序可以使用观察者模式来监测股票价格变化,并将这些变化通知给投资者。
在游戏中,观察者模式可用于处理各种事件,如玩家输入、碰撞检测、角色状态变化等。
在网络应用中,观察者模式可用于实现即时通信系统,其中用户之间的消息传递可以通过观察者模式来实现。
其中模型(Model)可以对应观察者模式中的观察目标,而视图(View)对应于观察者,控制器(Controller)则是中介者模式的应用场景之一。
观察者模式在设计和实现对象间的动态一对多关系时非常有用,有诸多优点,尤其是在需要避免紧耦合的场景中。然而,使用时需要注意上述优缺点,以确保系统的稳定性和效率。
以下是一个简单的观察者模式的实现:
- // 观察者接口
- interface Observer {
- void update(float temp, float humidity, float pressure);
- }
-
- // 目标接口
- interface Subject {
- void registerObserver(Observer o);
- void removeObserver(Observer o);
- void notifyObservers();
- }
-
- // 具体目标类
- class WeatherData implements Subject {
- private ArrayList<Observer> observers;
- private float temperature;
- private float humidity;
- private float pressure;
-
- public WeatherData() {
- observers = new ArrayList<>();
- }
-
- @Override
- public void registerObserver(Observer o) {
- observers.add(o);
- }
-
- @Override
- public void removeObserver(Observer o) {
- int i = observers.indexOf(o);
- if (i >= 0) {
- observers.remove(i);
- }
- }
-
- @Override
- public void notifyObservers() {
- for (Observer observer : observers) {
- observer.update(temperature, humidity, pressure);
- }
- }
-
- // 当获取到新的测量数据时,通知观察者
- public void measurementsChanged() {
- notifyObservers();
- }
-
- public void setMeasurements(float temperature, float humidity, float pressure) {
- this.temperature = temperature;
- this.humidity = humidity;
- this.pressure = pressure;
- measurementsChanged();
- }
- }
-
- // 具体观察者类
- class CurrentConditionsDisplay implements Observer {
- private float temperature;
- private float humidity;
-
- @Override
- public void update(float temp, float humidity, float pressure) {
- this.temperature = temp;
- this.humidity = humidity;
- display();
- }
-
- public void display() {
- System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
- }
- }
-
- // 使用观察者模式的示例
- public class WeatherStation {
- public static void main(String[] args) {
- WeatherData weatherData = new WeatherData();
-
- CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay();
- weatherData.registerObserver(currentDisplay);
-
- // 当气象测量更新时,观察者会接收到通知
- weatherData.setMeasurements(80, 65, 30.4f);
- }
- }
在这个例子中,WeatherData
类实现了Subject
接口,负责存储气象数据,并在数据更新时通知观察者。CurrentConditionsDisplay
类实现了Observer
接口,用于显示当前的气象状况。当WeatherData
的气象数据更新时,它会调用measurementsChanged()
方法,通知所有注册的观察者。观察者接收到通知后,会调用它们的update
方法来更新自身状态。
综上,观察者模式是软件设计模式中的一种,在此种模式中,一个目标对象管理所有依赖于其的观察者对象,并且当自身的状态改变时,会通知观察者对象,使它们能够自动更新。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。