java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java观察者模式

Java实现数据更新和事件通知的观察者模式

作者:.番茄炒蛋

Java观察者模式是一种行为型设计模式,用于实现对象间的一对多依赖关系。当一个对象的状态发生改变时,它的所有依赖对象都会收到通知并自动更新。观察者模式可以实现松耦合,增强了系统的可维护性和可拓展性

介绍

Java观察者模式(也称发布-订阅模式)是一种行为设计模式,用于对象之间的松散耦合,即当一个对象的状态发生变化时,其他依赖该对象的对象会被自动通知并作出相应的响应.

观察者模式有以下4种角色:

实现

观察者接口

public interface Observer {
    /**
     * 通知观察者变化信息
     *
     * @param temperature
     * @param humidity
     */
    void update(float temperature,float humidity);
}

主题接口

public interface Subject {
    /**
     * 注册观察者
     *
     * @param observer
     */
    void registerObserver(Observer observer);
    /**
     * 删除观察者
     *
     * @param observer
     */
    void removeObserver(Observer observer);
    /**
     * 通知所有观察者
     */
    void notifyObservers();
}

具体主题

public class WeatherData implements Subject {
    private List<Observer> observers;
    private float temperature;
    private float humidity;
    public WeatherData() {
        observers = new ArrayList<>();
    }
    /**
     * 注册观察者
     *
     * @param observer
     */
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    /**
     * 删除观察者
     *
     * @param observer
     */
    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    /**
     * 通知所有观察者
     */
    @Override
    public void notifyObservers() {
        observers.forEach(observer -> observer.update(temperature, humidity));
    }
    /**
     * 设置天气信息
     *
     * @param temperature
     * @param humidity
     */
    public void setMeasurements(float temperature, float humidity) {
        this.temperature = temperature;
        this.humidity = humidity;
        notifyObservers();
    }
}

具体观察者

public class CurrentConditionsDisplay implements Observer {
    private float temperature;
    private float humidity;
    public CurrentConditionsDisplay(Subject weatherData) {
        weatherData.registerObserver(this);
    }
    /**
     * 通知观察者变化信息
     *
     * @param temperature
     * @param humidity
     */
    @Override
    public void update(float temperature, float humidity) {
        this.temperature = temperature;
        this.humidity = humidity;
        display();
    }
    private void display() {
        System.out.println("温度:" + temperature + "℃;湿度:" + humidity + "%");
    }
}

测试

public class Demo {
    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();
        CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
        weatherData.setMeasurements(35,53);
        weatherData.setMeasurements(32,48);
        weatherData.setMeasurements(26,44);
    }
}

在这个例子中,WeatherData是主题,CurrentConditonsDisplay是观察者.当WeatherData的数据发生变化时,它会通知已经注册的所有观察者进行相应的更新.在这个例子中CurrentConditionsDisplay观察者会展示当前的温度和湿度信息.

总结

Java观察者模式时一种常见的设计模式.该模式中,一个对象(被观察者)维护了一个观察者列表,当它自身发生改变时,会自动通知所有观察者做出相应的响应.

优点

缺点

应用场景

到此这篇关于Java实现数据更新和事件通知的观察者模式的文章就介绍到这了,更多相关Java观察者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文