设计模式 - 观察者模式

Posted mr-wenyan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 - 观察者模式相关的知识,希望对你有一定的参考价值。

观察者模式定义:

  一个目标对象管理所有相依于它的观察者对象,并且在它本身状态发生改变时主动发出通知

气象检测实例:

  如图,气象站是获取实际气象数据的物理设备,WeatherData对象是用来追踪气象站的数据,并更新布告板。

  扩充WeatherData对象,使得布告板能够及时更新,并利于以后的扩展。

技术分享图片

coding:

技术分享图片
package Observer;

public interface Subject {

    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObserver();

}
Subject

suject作为观察目标的抽象类,其中包括注册观察者的抽象方法、移除已注册的观察者方法、通知观察者的方法。

所有的观察目标继承此抽象类。

技术分享图片
package Observer;

import java.util.ArrayList;

public class WeatherData implements Subject{

    private ArrayList observers;
    private float temperature;
    private float humidity;
    private float pressure;

    public WeatherData() {
        observers = new ArrayList();
    }

    public void registerObserver(Observer o) {
        observers.add(o);
    }

    public void removeObserver(Observer o) {
        int i = observers.indexOf(o);
        if (i >= 0) {
            observers.remove(i);
        }
    }

    public void notifyObserver() {
        for (int i =0; i< observers.size(); i++) {
            Observer observer = (Observer)observers.get(i);
            observer.update(temperature, humidity, pressure);
        }
    }

    public void measurementsChanged() {
        notifyObserver();
    }

    public void setMeasurements(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        measurementsChanged();
    }
}
WeatherData

具体观察目标,继承自抽象观察目标(subject),观察者可调用其中的registerObserver方法动态注册成为此观察目标的其中一个观察者。

notifyObserver遍历通知所有观察者。

 

技术分享图片
package Observer;

public interface Observer {

    public void update(float temp, float humidity, float pressure);
}
Observer

观察者抽象类,所有观察者可继承此类。

技术分享图片
package Observer;

public class CurrentConditionsDisplay implements Observer {

    private float temperature;
    private float humidity;
    private float pressure;
    private Subject weatherDay;

    public CurrentConditionsDisplay(Subject subject) {
        this.weatherDay = subject;
        weatherDay.registerObserver(this);
    }

    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("temp = " + temperature + " humi = " + humidity + " press = " + pressure);
    }
}
CurrentConditionsDisplay

具体观察者,在构造方法中,动态将自己注册成某一个观察目标的其中一个观察者。观察目标调用此类中的update方法动态通知数据的变化。

 

技术分享图片
package com.company;

import Observer.CurrentConditionsDisplay;
import Observer.WeatherData;

public class Main {

    public static void main(String[] args) {

        WeatherData weatherData = new WeatherData();

        CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);

        weatherData.setMeasurements(1, 3, 4);
    }
}
Main

run一下!

 

「观察者」调用「 观察目标」的注册方法,将自己注册成「观察目标」的其中一个「观察者」

「观察目标」在数据变化后,调用「观察者」的更新方法,更新「观察者」的数据

 

以上是关于设计模式 - 观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

Java设计模式补充:回调模式事件监听器模式观察者模式(转)

设计模式观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

观察者模式

未调用 LiveData 观察者

设计模式之美(c++)-笔记-56-观察者模式

设计模式之美(c++)-笔记-56-观察者模式