观察者 模式 有两个 角色,观察者observer ,被观察者observable。
- Observer 是个接口,只有一个方法 void update(Observable o, Object arg);
- Observable 是一个类,只有两个参数
private boolean changed = false;//是否发生改变
private Vector<Observer> obs;// 存放 观察者的 容器 就说明是 一对多,可以有多个观察者。
方法:
addObserver(Observer o)//添加 观察者
deleteObserver(Observer o)//删除 观察者
notifyObservers() //提醒 观察者有更新
notifyObservers(Object arg)
deleteObservers()//删除全部 观察者
setChanged()// changed ->true 有更新
clearChanged() //changed ->false
hasChanged()//是否有更新
countObservers()//观察者数量
重要函数 notifyObservers
public void notifyObservers(Object arg) {
Object[] arrLocal;
if (!changed)
return;
arrLocal = obs.toArray();//把vector里的数据(观察者)取出来放在 数组中
clearChanged();//恢复 状态 false 没有改变
for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal[i]).update(this, arg);然后 依次通知 观察者
}
跑个demo 溜溜
- Student (观察者)
public class Student implements Observer{
private String name;
public Student(String name) {
super();
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
System.out.println("来自"+o.getClass().getSimpleName().toString()+"的消息 : 尊敬的"+name+" 先生 "+arg);
}
}
- Teacher (被观察者)
public class Teacher_Cang extends Observable{
@Override
public synchronized void addObserver(Observer o) {
// TODO Auto-generated method stub
super.addObserver(o);
}
@Override
public void notifyObservers(Object arg) {
// TODO Auto-generated method stub
super.notifyObservers(arg);
}
@Override
protected synchronized void setChanged() {
// TODO Auto-generated method stub
super.setChanged();
}
}
public class Teacher_Wu extends Observable{
@Override
public synchronized void addObserver(Observer o) {
// TODO Auto-generated method stub
super.addObserver(o);
}
@Override
public void notifyObservers(Object arg) {
// TODO Auto-generated method stub
super.notifyObservers(arg);
}
@Override
protected synchronized void setChanged() {
// TODO Auto-generated method stub
super.setChanged();
}
- 主程序
public static void main(String[] args){
Student liMing = new Student("李明");
Student zhangSan = new Student("张三");
Teacher_Wu Wu = new Teacher_Wu();
Teacher_Cang Cang = new Teacher_Cang();
Wu.addObserver(liMing);
Cang.addObserver(zhangSan);
Cang.addObserver(liMing);
Cang.setChanged();
Cang.notifyObservers("老师有新作了~~");
Wu.setChanged();
Wu.notifyObservers("比隔壁 苍老师 还要劲爆奥~");
}
最后 运行结果
把陌生知识用有趣的例子表现出来~~哈哈
射虎不成重练箭,斩龙不断再磨刀