java 設計模式---->觀察者模式


爲什麼我們會選擇觀察者模式呢:

如果一個對象的數值或者狀態發生變化,依賴於他的很多的對象的都需要跟隨發生變化.如果依賴他的對象非常多.那麼觀察者是我們首先考慮的模式之一

今天我們講解觀察者模式:舉個簡單的例子說明.

就拿我們早上擠公交車來說:

觀察者:代表自己以及其他向擠上公交車的人.

被觀察者:就是公交車.

當然這個例子舉的有點不恰當,那就是 公交車的位置跟座標的變化是沒辦法通知到我們的,我們只能夠瞭解到眼前的情況,除非你公交車公司有人哈哈.

下面的情況 假設我們有公交車定位系統 就拿這個例子說明我們的觀察者模式:

主題類圖如下:

好了直接寫方法了:

/**
 * 公交車 被觀察者類
 * @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哦
好不容易等來公交車
給老闆打個電話:公交車擠不上去 ,晚點到公司. 老闆無語了

分析結果:

所有的觀察者都會受到被觀察者發出來的信息.









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章