Welcome everyone

观察者模式

设计模式 汪明鑫 1000浏览 0评论

先举个小例子,差不多就了解观察者模式是什么玩意了

比如有一个天气数据中心,

有2个app(如墨迹天气、天气预报)的数据都是订阅这个数据中心的

当天气数据中心得到最新的天气情况,就会触发一个通知,通知所有的观察者,即上文说的墨迹天气、天气预报

这时候又来了一个新的天气app,比如某手机内置天气软件,也要订阅这个数据中心,因此数据中心需要提供注册观察者的功能

同样也需要提供移除某观察者的能力,比如某软件觉得数据中心的天气数据不靠谱,花大成本自己来做,不用数据中心的

 

首先需要一个主题接口,被观察者

/**
 * @author wmx
 * @date 2019-09-16
 */
public interface Subject {
    /**
     * 注册观察者
     * 
     * @param
     * @return 
     * @throws
     */
    void registerObserver(Observer observe);

    /**
     * 解除绑定观察者
     *
     * @param
     * @return
     * @throws
     */
    void unRegisterObserver(Observer observe);

    /**
     * 通知观察者
     *
     * @param
     * @return
     * @throws
     */
    void notifyObservers(String msg);
}

 

天气数据中心

/**
 * 天气
 *
 * @author wmx
 * @date 2019-09-16
 */
@Data
public class WeatherData implements Subject{

    private List<Observer> observers = new ArrayList<>();

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

    @Override
    public void unRegisterObserver(Observer observe) {
        observers.remove(observe);
    }

    @Override
    public void notifyObservers(String msg) {
        observers.forEach(e->{
            e.update(msg);
        });
    }
}

 

观察者

/**
 * 观察者
 *
 * @author wmx
 * @date 2019-09-16
 */
public interface Observer {
    void update(String msg);
}

 

具体观察者

/**
 * 墨迹天气
 *
 * @author wmx
 * @date 2019-09-16
 */
public class MojitianqiObserver implements Observer{

    @Override
    public void update(String msg) {
        System.out.println("墨迹天气接收天气变化信息:" + msg );
    }
}
/**
 * 天气预报
 *
 * @author wmx
 * @date 2019-09-16
 */
public class TianqiyubaoObserver implements Observer{
    @Override
    public void update(String msg) {
        System.out.println("天气预报接收天气变化信息:" + msg );
    }
}
/**
 * @author wmx
 * @date 2019-09-16
 */
public class Main {
    public static void main(String[] args) {
        //被观察者
        WeatherData weatherData = new WeatherData();

        //观察者
        MojitianqiObserver mojitianqiObserver = new MojitianqiObserver();
        TianqiyubaoObserver tianqiyubaoObserver = new TianqiyubaoObserver();

        List<Observer> observers = weatherData.getObservers();
        observers.add(mojitianqiObserver);
        observers.add(tianqiyubaoObserver);

        //数据变更,通知观察者
        weatherData.notifyObservers("9月16日 晴 18度-26度");

        observers.remove(tianqiyubaoObserver);
        weatherData.notifyObservers("9月17日 阴 16度-24度");
    }
}

输出:

墨迹天气接收天气变化信息:9月16日 晴 18度-26度
天气预报接收天气变化信息:9月16日 晴 18度-26度
墨迹天气接收天气变化信息:9月17日 阴 16度-24度

 

观察者模式差不多就是这个意思了

 

其实也不用手写观察者模式

JDK内部已经内置了观察者模式的实现

java.util.Observable  java.util.Observer

具体用法百度一大堆

 

观察者模式通用类图:

 

 

后面可以研究下一些框架中哪些地方用到观察者模式

印象中Spring 中用到的挺多

TODO项还是很多的

转载请注明:汪明鑫的个人博客 » 观察者模式

喜欢 (7)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz