观察者模式(ObserverPattern)。用于实时监测某些Object的动态、只要Object一改变、那么他的所有观察者Observer都会知道、之后观察者会根据Object的改变进行下一步操作。这个在SWING编程中是最常见的。那些Listener就是观察者。
观察者模式角色如下:
抽象主题(Subject)角色:抽象主题角色提供维护一个观察者对象聚集的操作方法,对聚集的增加、删除等。
具体主题(ConcreteSubject)角色:将有关状态存入具体的观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色负责实现抽象主题中聚集的管理方法。
抽象观察者(Observer)角色:为具体观察者提供一个更新接口。
具体观察者(ConcreteObserver)角色:存储与主题相关的自洽状态,实现抽象观察者提供的更新接口。
六大问题:
1、目标与观察者之间的关系
一对多 或者 多对一
2、单向依赖:观察者被动等待目标
3、命名建议:subject observer update
4、触发更新的时机
5、观察者模式的调用顺序示意图:
创建目标 创建观察者 注册观察者
6、通知的顺序
观察者之间是平行通知优先级
两种模型:
1、推模型:update传递目标对象的部分信息
2、拉模型:update传递目标对象本身
优缺点:
1、实现了观察者和目标之间的抽象耦合
2、观察者模式实现了动态联动
3、支持广播通信
4、会引起无谓的操作
何时使用观察者模式:
触发联动
采用java自带的观察者模式:
目标代码:
package com.nudt.design.javaObserver;
import java.util.Observable;
/**
* Created by jeffrey on 15-12-1.
*/
public class ConcreteWeatherSubject extends Observable {
private String weatherContend;
public String getWeatherContend() {
return weatherContend;
}
public void setWeatherContend(String weatherContend) {
this.weatherContend = weatherContend;
this.setChanged();
this.notifyObservers(weatherContend);//推模式
//this.notifyObservers();//拉模式
}
}观察者代码:
package com.nudt.design.javaObserver;
import java.util.Observable;
import java.util.Observer;
/**
* Created by jeffrey on 15-12-1.
*/
public class ConcreteObserver implements Observer {
private String observerName;
public String getObserverName() {
return observerName;
}
public void setObserverName(String observerName) {
this.observerName = observerName;
}
@Override
public void update(Observable observable, Object o) {
//推的方式
System.out.println(observerName + "get:"+ o);
//拉的方式
//System.out.println(observerName +"get:" + ((ConcreteWeatherSubject)observable).getWeatherContend();
}
}区别对待观察者场景
就是简单的判断语句
原文:http://muyunzhe.blog.51cto.com/9164050/1718672