观察者模式结构图
使用场景
1.需要推送到每一位订阅对象的时候。如微信公众号文章推送,报纸订阅推送。
2.观察者模式也可以使用拉的方法,要求主体推送由每个对象自由获取主体的每个属性,就不会强迫被迫接收一堆的属性。如果主体需要扩展功能,也不会影响到观察者本身,不用修改每个观察者的调用,只需要主体公布共多的get方法来取得新增的状态。
3.jdk本身也提供了观察者java.util.Observable类和java.util.Observer接口,但是由于Observable是一个类,而不是接口,限制了他的使用和复用,然而他提供了很多有用的功能,只是面对松耦合的程度来说不是那么完美。而且他的setChanged()方法使用了protected,意味着只有继承Observable才可以使用,无法组合到对象中来。
代码设计
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
1.定义一个观察者变量,改类是用来注册或者删除的
public interface Subject {
public void registerObserver(Observer o);
public void removeoObserver(Observer o);
public void notifyObserver();
}
2.定义一个观察者接口
/**
* 观察者接口
*/
public interface Observer {
public void update(float temp,float humidty,float pressure);
}
3.定义一个调用方法
public interface DisplayElement {
/**
* 显示时调用
*/
public void display();
}
3.定义一个主体
package com.boco.eoms.observer;
import java.util.ArrayList;
public class WeatcherDate implements Subject {
private ArrayList observers;
private float temp;
private float humidty;
private float pressure;
/**
* 用来记录观察者
*/
public WeatcherDate(){
observers = new ArrayList();
}
public void registerObserver(Observer o){
observers.add(o);
};
public void removeoObserver(Observer o){
int i = observers.indexOf(o);
if(i>0){
observers.remove(i);
}
};
//循环推送调用update,通知所有观察者
public void notifyObserver(){
for (int i = 0; i < observers.size(); i++) {
Observer observer = (Observer)observers.get(i);
observer.update(temp, humidty, pressure);
}
};
public void measuermentsChanged(){//通知观察者
notifyObserver();
}
public void setMeasurements(float temp,float humidty,float pressure){
this.humidty = humidty;
this.pressure = pressure;
this.temp = temp;
measuermentsChanged();
}
}
4.定义了一个观察者
package com.boco.eoms.observer;
public class CurrentDisplay implements Observer,DisplayElement{
private Subject whatchDate;
private float temp;
private float humidty;
public CurrentDisplay (Subject whatchDate){
//初始化主体,并且把自己传递给主体。
this.whatchDate = whatchDate;
//此时主体已经增加了这个观察者的对象
whatchDate.registerObserver(this);
}
public void update(float temp,float humidty,float pressure){
this.humidty = humidty;
this.temp = temp;
display();
}
public void display(){
System.out.println(temp+"/"+humidty+"/"+"/");
}
}
5.测试
package com.boco.eoms.observer;
public class Test {
public static void main(String[] args) {
WeatcherDate weatcherDate = new WeatcherDate();
CurrentDisplay curr = new CurrentDisplay(weatcherDate);
weatcherDate.setMeasurements(100f, 28.4f,88.1f);
}
}