观察者模式-发布订阅模式
一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象
当主题对象发送变化时会通知所有观察者
观察者自动更新自己
java本身有自带观察者模式实现
java.util.Observable 被观察者
setChanged();//数据改变
notifyObservers();//发起通知,这个需要与setChanged()一起使用,使用这个 观察者会自动调用 update方法
notifyObservers(Object arg);//发送通知,并且传数据给观察者
java.util.Observer 观察者
重写 update(Observable o, Object arg) 方法,Observable o为 被观察者对象,arg对应 notifyObservers(Object arg)的arg;
当被观察者发起 notifyObservers 通知时,观察者会自动调用此update方法
用观察者模式实现 员工观察老板发命令的例子:
老板类(被观察者类):
/**
* 老板类 被观察者
*/
public class Boss extends Observable {
private String cmd;
public void sendCmd(String cmd){
System.out.println("老板发命令了 "+cmd);
this.cmd =cmd;
setChanged();//改变 一定要先调用 setChanged
// notifyObservers();//调用
String data = "老板发出的命令";
notifyObservers(data);
}
//getter and setter
public String getCmd() {
return cmd;
}
public void setCmd(String cmd) {
this.cmd = cmd;
}
}
员工类(观察者类):
/**
* 员工类,观察者
*/
public class Staff implements Observer {
private String name;
public Staff(Boss boss,String name){//得到被观察者的所有
boss.addObserver(this);//观察老板的一举一动
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
Boss boss = (Boss) o;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("老板有新命令"+" 员工"+name+" 准备行动 "+boss.getCmd() +" 线程:"+Thread.currentThread() + " "+ arg);
}
}
main方法:
public static void main(String[] args) {
System.out.println("主函数,可以在任意类");
Boss boss = new Boss();
Staff staff1 = new Staff(boss,"小赵");
Staff staff2 = new Staff(boss,"小黄");
Staff staff3 = new Staff(boss,"小刘");
//老板发命令了
boss.sendCmd("休息");
boss.sendCmd("工作");
}
运行结果:
主函数,可以在任意类
老板发命令了 休息
老板有新命令 员工小刘 准备行动 休息 线程:Thread[main,5,main] 老板发出的命令
老板有新命令 员工小黄 准备行动 休息 线程:Thread[main,5,main] 老板发出的命令
老板有新命令 员工小赵 准备行动 休息 线程:Thread[main,5,main] 老板发出的命令
老板发命令了 工作
老板有新命令 员工小刘 准备行动 工作 线程:Thread[main,5,main] 老板发出的命令
老板有新命令 员工小黄 准备行动 工作 线程:Thread[main,5,main] 老板发出的命令
老板有新命令 员工小赵 准备行动 工作 线程:Thread[main,5,main] 老板发出的命令
说明观察者响应都是同步进行响应的,一个一个进行响应的。