需要几个关键角色
1.被观察对象(可观察对象)
2.观察者
观察者想要观察被观察对象,就需要两者之间建立一种一对多的关系。
建立关系后,需要关注的一点就是如果将被观察者更新的消息传递给观察者。
一种是推的方式,即被观察更新信息后,立刻把数据推给观察者。
另一种是拉的方式,即观察者从被观察者那拉取数据。
先看推的方式吧
类图 : 一个可以被观察的接口 Obserable ,一个观察者 Observer
被观察者的实现,本文就是期望一个天气预报的更新
气象站 -- weatherData(被观察者) ---- Temperature(观察者)
代码实例:
被观察者;
package com.ming.test.observer;
public interface Observable {
void regisiterObserver(Observer o);
void removeObserver(Observer o);
void notifyObserver();
}
观察者:
package com.ming.test.observer;
public interface Observer {
void update(float t,float h,float p);
}
具体的业务操作接口:这里是简单的展示
package com.ming.test.observer;
public interface DisplayMent {
void display();
}
被观察者的实现
package com.ming.test.observer;
import java.util.ArrayList;
import java.util.List;
public class WeatherData implements Observable {
private List<Observer> observerList; //这里只是简单的原理实现,具体还需要考虑多线程并发的情况。具体自己写个简单的东西看看
private float t;
private float h;
private float p;
public WeatherData() {
observerList = new ArrayList<Observer>();
}
@Override
public void regisiterObserver(Observer o) {
observerList.add(o);
}
@Override
public void removeObserver(Observer o) {
int i = observerList.indexOf(o);
if (i > 0) {
observerList.remove(i);
}
}
//通知观察者
@Override
public void notifyObserver() {
for (int i = 0; i < observerList.size(); i++) {
Observer o = observerList.get(i);
o.update(t, h, p); //这里就是主动的给观察者推消息了!
}
}
public void changed() {
notifyObserver();
}
//数据更新了
public void setMeasurements(float t, float h, float p) {
this.t = t;
this.h = h;
this.p = p;
changed();
}
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
AOberver observer = new AOberver();
weatherData.regisiterObserver(observer);
weatherData.setMeasurements(0.2f, 0.3f, 0.6f);
System.out.println("this is seperator notation ----------------");
weatherData.setMeasurements(0.6f, 1.3f, 2.6f);
}
}
观察者:
package com.ming.test.observer;
public class AOberver implements Observer,DisplayMent {
private float t;
private float h;
//被被观察者对象调用,被动
@Override
public void update(float t, float h, float p) {
this.t = t;
this.h = h;
display();
}
@Override
public void display() {
System.out.println("the temperature is:" + t +"the humidity is :" + h);
}
}