• java观察者模式


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

    观察者模式的角色和实现:

    1. 主题(Subject)

      • 主题对象维护一个观察者列表,并提供方法来增加或删除观察者。
      • 当主题状态发生变化时,会通知所有注册的观察者。
    2. 观察者(Observer)

      • 观察者定义了一个更新接口,用于在主题状态发生变化时接收通知和更新自身状态。
    3. 具体主题(Concrete Subject)

      • 具体主题是主题的具体实现,维护着自己的状态。
      • 当状态变化时,负责通知所有注册的观察者。
    4. 具体观察者(Concrete Observer)

      • 具体观察者实现了观察者接口,在接收到主题的通知时执行具体的更新操作。

    示例代码演示:

    1. 创建主题接口和观察者接口:
    // 主题接口
    public interface Subject {
        void registerObserver(Observer observer);
        void removeObserver(Observer observer);
        void notifyObservers();
    }
    
    // 观察者接口
    public interface Observer {
        void update(String message);
    }
    
    2. 创建具体主题和具体观察者类:
    import java.util.ArrayList;
    import java.util.List;
    
    // 具体主题实现
    public class WeatherStation implements Subject {
        private List<Observer> observers;
        private String weatherMessage;
    
        public WeatherStation() {
            this.observers = new ArrayList<>();
        }
    
        @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(weatherMessage);
            }
        }
    
        public void setWeatherMessage(String weatherMessage) {
            this.weatherMessage = weatherMessage;
            notifyObservers(); // 通知观察者状态更新
        }
    }
    
    // 具体观察者实现
    public class PhoneDisplay implements Observer {
        private String weatherMessage;
    
        @Override
        public void update(String message) {
            this.weatherMessage = message;
            display();
        }
    
        public void display() {
            System.out.println("Phone Display: " + weatherMessage);
        }
    }
    
    3. 客户端代码演示观察者模式的应用:
    public class Main {
        public static void main(String[] args) {
            WeatherStation weatherStation = new WeatherStation();
    
            // 创建具体观察者
            PhoneDisplay phoneDisplay = new PhoneDisplay();
    
            // 注册观察者
            weatherStation.registerObserver(phoneDisplay);
    
            // 模拟天气更新,并通知观察者
            weatherStation.setWeatherMessage("Today is sunny");
    
            // 如果需要,可以注销观察者
            // weatherStation.removeObserver(phoneDisplay);
        }
    }
    
    输出结果:
    Phone Display: Today is sunny
    

    在这个例子中:

    • WeatherStation 类实现了 Subject 接口,维护一个观察者列表,并负责通知观察者状态变化。
    • PhoneDisplay 类实现了 Observer 接口,具体实现了在收到通知时如何更新和显示信息。
    • Main 类中,创建了 WeatherStationPhoneDisplay 对象,注册观察者并模拟天气更新,观察者接收到通知后更新并显示最新的天气信息。

    观察者模式非常有用,特别是在需要一对多通知的场景,如事件处理、GUI 界面更新、分布式系统中的状态同步等。

  • 相关阅读:
    Matlab论文插图绘制模板第41期—气泡图(bubblechart)
    课程设计:班级通讯录管理系统(Java+MySQL)
    时间序列预测的输入
    Ip2region 离线IP地址定位库
    [前端网站源码]基于HTML5,DIV CSS实现的宠物狗个性化服务网站前端(静态网页设计)
    【分享】“明道云“ 在集简云平台集成应用的常见问题与解决方案
    LLVM 文档收集
    《算法备案与数据安全:双重保障》
    玩机搞机---mtk芯片机型线刷救砖的一些基本解决方法和步骤解析 mtk报错代码 SP_Flash平台刷机
    NIO学习
  • 原文地址:https://blog.csdn.net/wsrzsfgst/article/details/140457235