定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新
先看类图
再看源码
package observer_Push;
public interface ISubject {
public void registerObserver(IObserver observer);
public void removeObserver(IObserver observer);
public void notifyObserver();
public void setTemperatureAndpressure(float temp,float pressure);
}
package observer_Push;
/**
* 观察者实现接口,这样主题类就可以通知观察者
* @author 格拉.香农
*
*/
public interface IObserver {
//这是推
public void update(float temp,float pressure);
//这是拉
//pubic void update(ISubject subject);
}
package observer_Push;
import java.util.ArrayList;
public class Subject implements ISubject {
private ArrayList<IObserver> list;
private float temperature;
private float pressure;
public Subject(){
list=new ArrayList<IObserver>();
}
@Override
public void registerObserver(IObserver observer) {
list.add(observer);
}
@Override
public void removeObserver(IObserver observer) {
if(list.contains(observer))
list.remove(observer);
}
@Override
public void notifyObserver() {
for(IObserver observer:list)
observer.update(temperature,pressure);
}
/**
* 当数据变化时调用notifyObserver()方法,通知观察者
* @param temp 温度
* @param pressure 气压
*/
public void setTemperatureAndpressure(float temp,float pressure){
this.temperature=temp;
this.pressure=pressure;
notifyObserver();
}
public float getTemperature() {
return temperature;
}
public void setTemperature(float temperature) {
this.temperature = temperature;
}
public float getPressure() {
return pressure;
}
public void setPressure(float pressure) {
this.pressure = pressure;
}
}
package observer_Push;
public class ObserverImpl01 implements IObserver {
private ISubject subject;
private float temp;
/**
* 在观察者保存主题类引用,方便注册和取消注册
*
* @param sub 主题类
*/
public ObserverImpl01(ISubject sub){
subject=sub;
subject.registerObserver(this);
}
/**
*
*/
public void unRegister(){
subject.removeObserver(this);
}
@Override
public void update(float temp, float pressure) {
this.temp=temp;
display();
}
private void display() {
System.out.println("现在最新气温:"+temp);
}
}
package observer_Push;
public class ObserverImpl02 implements IObserver {
private ISubject subject;
private float pressure;
/**
* 在观察者保存主题类引用,方便注册和取消注册
*
* @param sub 主题类
*/
public ObserverImpl02(ISubject sub){
subject=sub;
subject.registerObserver(this);
}
/**
*
*/
public void unRegister(){
subject.removeObserver(this);
}
@Override
public void update(float temp, float pressure) {
this.pressure=pressure;
display();
}
private void display() {
System.out.println("现在最新气压:"+pressure);
}
}
package observer_Push;
public class Test {
/**
* 观察者模式(推),主题把所有数据都给观察者,无论观察者是否需要
*/
public static void main(String[] args) {
ISubject subject = new Subject();
IObserver impl01 = new ObserverImpl01(subject);
IObserver impl02 = new ObserverImpl02(subject);
subject.setTemperatureAndpressure(22, 23);
subject.setTemperatureAndpressure(32, 33);
subject.setTemperatureAndpressure(42, 43);
}
}
subject是有状态的(我的意思是线程安全)
观察者模式关于观察者如何获取数据分为推和拉
我没有想到的是观察者保存subject的引用,用来注册和取消注册。观察者在new 是就一个向subject注册,subject的ArrayList的列表里自动就有了这个观察者。只能用
触发联动
触发联动
触发联动
来形容了