import java.util.Observable;
/**
* Created by bashen on 2016/7/5.
*/
public class WeatherSubject extends Observable {
//推送的内容
private String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
//通知之前,记得设置这个
super.setChanged();
//这里是主动通知,即 推模型
super.notifyObservers(content);
//拉模型
//super.notifyObservers();
}
}
import java.util.Observable;
import java.util.Observer;
/**
* Created by bashen on 2016/7/5.
*/
public class WeatherObsever implements Observer{
//观察者名称
private String observerName;
public String getObserverName() {
return observerName;
}
public void setObserverName(String observerName) {
this.observerName = observerName;
}
@Override
public void update(Observable o, Object arg) {
System.out.println(getObserverName() + "收到了消息,目标推送过来的是:" + arg);
//System.out.println(getObserverName() + "收到了消息,主动到目标对象中去拉,拉的内容是:" + ((WeatherSubject)o).getContent());
}
}
public class Client {
public static void main(String[] args) {
//创建一个被观察者
WeatherSubject subject = new WeatherSubject();
//创建观察者
WeatherObsever girl = new WeatherObsever();
girl.setObserverName("小花");
WeatherObsever boy = new WeatherObsever();
boy.setObserverName("小明");
//注册观察者
subject.addObserver(girl);
subject.addObserver(boy);
//发布消息
subject.setContent("天气晴,气温28℃,适合出游");
}
}
使用场景:
第一 当一个抽象模型有两个方面,其中一个方面的操作依赖于另一个方面的状态变化
第二 如果在更改一个对象的时候,需要同时连带改变其他对象,而且不知道究竟应该有多少对象需要被连带改变
第三 当一个对象必须通知其他的对象,但是你又希望这个对象和其他被它通知的对象是松散耦合的
方法介绍:
Observable的简单功能介绍:
addObserver(Observer o) 添加观察着
clearChanged() 清除变化,则把“变化标志”设为false
countObservers() 统计观察着数量
deleteObserver(Observer o) 删除观察者
deleteObservers() 删除所有的观察者
hasChanged() 测试是否有变化(则返回“变化标志”)
notifyObservers() 如果hasChanged()=ture,通知所有的观察着(则调用Observer.update()方法)
notifyObservers(Object arg) 如果hasChanged()=ture,通知所有的观察着(则调用Observer.update()方法),并把参数arg传过去
setChanged() 设置变化,则把“变化标志”设为true
Observable的简单功能介绍
update(Observable o, Object arg) Observable唯一的方法,在被通知时被Observable调用