前言
本文来自《Head Fist 设计模式》一书的实例,这里仅仅是个人笔记记录
观察者模式定义
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态的时候,她的所有依赖着都会收到通知并自动更新。
需求
气象站需要想订阅温度数据的客户推送温度数据,请用观察者模式实现
需求分析
这里是一个一对多的关系,且必须是订阅的客户才可以收到这个数据。
即气象站:需要提供注册接口,和消息通知接口
客户即观察者:需要有接收消息的接口
开发
主题基类接口
/**
* 主题/服务端,负责给已注册的观察者发布消息
*/
public interface Subject {
public void registerOberver(Observer o);
public void removeOberver(Observer o);
// 通知消息/push消息给观察者
public void notifyObservers();
}
其对应实现者-气象站数据
public class WeathData implements Subject {
private ArrayList<Observer> list;
public void WeathData() {
list = new ArrayList<>();
}
public void registerOberver(Observer o){
list.add(o);
}
public void removeOberver(Observer o){
int i = list.indexOf(o);
if(i >= 0) {
list.remove(o);
}
}
public void notifyObservers(){
for(Observer o: list){
o.update(getTempTestData());
}
}
public float getTempTestData(){
return 26.0;
}
// 自己做个小按钮更新数据进行模拟
public void dataChangeByTest(){
notifyObservers()
}
}
观察者基类接口
/**
* 观察者接口
*/
public interface Observer {
public void update(float temp)
}
其对应实现者观察者
public class MyObserver implements Observer {
private Subject mWeathData;
public void MyObserver(Subject mWeathData) {
this.mWeathData = mWeathData;
// 向气象数据中心注册观察者,便于接收消息
this.mWeathData.registerOberver(this);
}
public void update(float temp) {
// 显示温度
}
}
跑一跑Demo
class OberserPattern
{
public static void main(String[] args)
{
System.out.println("Hello World!");
// 建立气象数据站
Subject mWeathData = new WeathData();
// 建立观察者,观察者向气象数据站注册,以便接收温度数据
Observer mMyObserver = new MyObserver(mWeathData);
// 模拟一个温度下发事件,即可看到观察者接收到数据了
mMyObserver.dataChangeByTest();
}
}
结语
日常生活中的订阅微信公众号,订阅报纸也是观察者模式。尤其是实际项目代码中也是最频繁用到的模式之一。