观察者模式

   博客分类: 学习笔记 文章类型: 原创

观察者模式

本文字数为 2412 字, 预计读完大约需要 7 分钟

观察者模式

定义了对象之间的一对多依赖,当一个对象改变状态的时候,它的所有依赖者都会收到通知而自动更新


/**
* 定义被观察者接口,定义被观察者应该实现的方法
* 包括观察者注册,移除观察者,以及通知观察者数据的更新
*/
public interface Subject{
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers(Object subject, Object dataChanges);
}

/**
* 定义观察者接口
*/
public interface Observer {
    /**
    * 接收被观察者的更新消息
    * 第一个参数是被观察者的对象,用于观察者主动从被观察者哪里获取消息
    * 第二个参数是被更改的数据,用于通知观察者被动更改数据
    */
    void update(Object subject, Object dataChanges);
}

/**
* 被更新的数据
*/
public class Data {
    private float temperature;
        private float humidity;
        private float pressure;
    
        public Data(float temperature, float humidity, float pressure) {
            this.temperature = temperature;
            this.humidity = humidity;
            this.pressure = pressure;
        }
    
        public float getTemperature() {
            return temperature;
        }
    
        public float getHumidity() {
            return humidity;
        }
    
        public float getPressure() {
            return pressure;
        }
    
        @Override
        public String toString() {
            return "temperature:" + temperature + "  humidity:" + humidity + "  pressure:" + pressure;
        }
}

public class WeatherData implements Subject {
    
    /**
     * 用于存放所有的观察者
     */
    private List<Observer> observers;

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

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

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

    public void setData(Data data) {
        notifyObservers(this, data);
    }

    @Override
    public void notifyObservers(Object subject, Object dataChanges) {
        observers.forEach((observer) -> observer.update(subject, dataChanges));
    }
}

//实现观察者
public class CurrentConditionsDisplay implements Observer {

    private int id;

    public CurrentConditionsDisplay() {
        this.id = new Random().nextInt(100);
    }

    @Override
    public void update(Object subject, Object dataChanges) {
        System.out.println("Observer[" + id + "] observe data:");
        System.out.println(dataChanges);
    }
}

//测试
private static void testObserver() {
        WeatherData weatherData = new WeatherData();
        CurrentConditionsDisplay observer1 = new CurrentConditionsDisplay();
        CurrentConditionsDisplay observer2 = new CurrentConditionsDisplay();
        CurrentConditionsDisplay observer3 = new CurrentConditionsDisplay();
        weatherData.registerObserver(observer1);
        weatherData.registerObserver(observer2);
        weatherData.registerObserver(observer3);
        weatherData.setData(new Data(17.0f, 18.1f, 45.6f));
        weatherData.setData(new Data(25.0f, 12.1f, 45.6f));
        weatherData.setData(new Data(84.0f, 18.8f, 45.6f));
        weatherData.setData(new Data(47.0f, 14.4f, 45.6f));
        weatherData.removeObserver(observer1);
        weatherData.removeObserver(observer2);
        weatherData.removeObserver(observer3);
}

  • 上一篇:装饰器模式
  • 下一篇:设计模式总结