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调用