觀察者模式-發佈訂閱模式 一種一對多的依賴關係,讓多個觀察者對象同時監聽某一主題對象 當主題對象發送變化時會通知所有觀察者 觀察者自動更新自己 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] 老闆發出的命令
說明觀察者響應都是同步進行響應的,一個一個進行響應的。