設計模式-觀察者模式 java自帶

觀察者模式-發佈訂閱模式
一種一對多的依賴關係,讓多個觀察者對象同時監聽某一主題對象
當主題對象發送變化時會通知所有觀察者
觀察者自動更新自己

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] 老闆發出的命令

 

說明觀察者響應都是同步進行響應的,一個一個進行響應的。

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