爲什麼我們會選擇觀察者模式呢:
如果一個對象的數值或者狀態發生變化,依賴於他的很多的對象的都需要跟隨發生變化.如果依賴他的對象非常多.那麼觀察者是我們首先考慮的模式之一
今天我們講解觀察者模式:舉個簡單的例子說明.
就拿我們早上擠公交車來說:
觀察者:代表自己以及其他向擠上公交車的人.
被觀察者:就是公交車.
當然這個例子舉的有點不恰當,那就是 公交車的位置跟座標的變化是沒辦法通知到我們的,我們只能夠瞭解到眼前的情況,除非你公交車公司有人哈哈.
下面的情況 假設我們有公交車定位系統 就拿這個例子說明我們的觀察者模式:
主題類圖如下:
好了直接寫方法了:
/**
* 公交車 被觀察者類
* @author 0001
*
*/
public class Bus extends Observable{
//位置的改變
public void position(){
this.trace("公交車位置發生變化");
super.setChanged();//通知所有觀察者
super.notifyObservers("公交車慢悠悠的爬過來");
}
//人數的變化
public void personChange(){
this.trace("人數已10的N次方不斷的暴增");
super.setChanged();
super.notifyObservers("向上的車的準備戰鬥了,已經超載了");
}
public void trace(String message){
System.out.println(message);
}
}
觀察者類:
/**
* 一定一類人
* @author 0001
*
*/
public interface PersonCategory {
public void reportBoss(String context);
}
/**
* 定義上班族
* @author 0001
*/
public class OfficeWork implements Observer,PersonCategory{
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
System.out.println("好不容易等來公交車");
this.reportBoss(arg.toString());
}
public void reportBoss(String context) {
// TODO Auto-generated method stub
System.out.println("給老闆打個電話:公交車擠不上去 ,晚點到公司. 老闆無語了");
}
}
/**
* 小偷
*/
import java.util.Observable;
import java.util.Observer;
public class Thief implements Observer,PersonCategory{
public void reportBoss(String context) {
// TODO Auto-generated method stub
System.out.println("報告老闆 ,偷了一部Iphone 4s,5s哦");
}
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
System.out.println("馬上開工了");
this.reportBoss(arg.toString());
}
}
測試類:
import java.util.Observer;
public class ClientTest {
public static void main(String args[]){
PersonCategory pcDemo=new OfficeWork();
Bus bus=new Bus();
bus.addObserver((Observer) pcDemo);
bus.personChange();
System.out.println("==================================>");
//小偷
PersonCategory thiefDemo=new Thief();
bus.addObserver((Observer) thiefDemo);
bus.personChange();
}
}
輸出結果
人數已10的N次方不斷的暴增
好不容易等來公交車
給老闆打個電話:公交車擠不上去 ,晚點到公司. 老闆無語了
==================================>
人數已10的N次方不斷的暴增
馬上開工了
報告老闆 ,偷了一部Iphone 4s,5s哦
好不容易等來公交車
給老闆打個電話:公交車擠不上去 ,晚點到公司. 老闆無語了
分析結果:
所有的觀察者都會受到被觀察者發出來的信息.