觀察者模式常常利用通知上面,當物件狀態改變需要通知其他全部的物件一起變更時,這種模式也被稱為發佈-訂閱模式
觀察者定義
定義物件一對多關係,當一個物件改變狀態時,所有相依它的物件都會自動被改變。 主題(Subject) : 定義註冊、非註冊、通知改變和更新等動作 觀察者(observer):設定主題和更新觀察者 案例: Java Message Service (JMS)
觀察者用法
- 跨系統訊息交換,如訊息序列、事件觸發等
- 關聯行為
- GUI前後台的串接,當更新某個元件的狀態,也回影響
觀察者例子
我們利用主從式例子來說明觀察者的例子,當我主伺服器會下達˙訊息給三個從級伺服器,這三台會同步的更新訊息
/** * Name: Observer.java * Description : 觀察者 * Created by bryant on 2017/1/14. */ public interface IObserver { //更新觀察者、 public void update(); }
/** * Name: ISubject.java * Description : 主題 * Created by bryant on 2017/1/14. */ public interface ISubject { //註冊 public void register(IObserver observer) ; //取消註冊 public void unregister(IObserver observer); //更新主題 public String update(); //通知觀察者 public void notifyObservers(); }
/** *MasterSubject.java * Description : 主伺服器 * Created by bryant on 2017/1/14. */ public class MasterSubject implements ISubject { private List slave ; private boolean change; private String message ; public MasterSubject(){ this.slave = new ArrayList(); } @Override public void register(IObserver observer) { if(observer==null){ throw new NullPointerException("Null Observer"); }else{ slave.add(observer); } } @Override public void unregister(IObserver observer) { if(observer==null){ throw new NullPointerException("Null Observer"); }else{ slave.remove(observer); } } @Override public String update() { return this.message ; } @Override public void notifyObservers() { if(this.change){ for(IObserver observer : this.slave){ observer.update(); } } } //送出訊息 public void postMessage(String mesage){ this.message = mesage ; this.change = true ; notifyObservers(); } }
/** * Name: Observer.java * Description : 觀察者 * Created by bryant on 2017/1/14. */ public class SlaveObserver implements IObserver{ private String name ; private ISubject master ; //設定名稱與訂閱端 public SlaveObserver(String name, MasterSubject master){ this.name = name ; this.master = master ; } @Override public void update() { String message = (String) this.master.update(); if(message==null){ System.out.println("no message"); }else{ System.out.println(name+":"+message); } } }
/** * Name: MasterSlaveDemo.java * Description : 主從式架構,當主伺服器發送訊息給其他從級伺服器 * Created by bryant on 2017/1/14. */ public class MasterSlaveDemo { public static void main(String[] args){ MasterSubject master = new MasterSubject(); SlaveObserver slave01 = new SlaveObserver("slave-1",master); SlaveObserver slave02 = new SlaveObserver("slave-2",master); SlaveObserver slave03 = new SlaveObserver("slave-3",master); master.register(slave01); master.register(slave02); master.register(slave03); master.postMessage("同步更新資料"); master.unregister(slave02); master.postMessage("slave-2不更新"); } }
輸出
slave-1:同步更新資料
slave-2:同步更新資料
slave-3:同步更新資料
slave-1:slave-2不更新
slave-3:slave-2不更新
觀察者與MVC的關係
MVC架構使用觀察者當作controller和view的溝通機制,在JAVA中提供兩個類別來支援MVC 1. Observer: 2. 待續......
留言
張貼留言