觀察者模式常常利用通知上面,當物件狀態改變需要通知其他全部的物件一起變更時,這種模式也被稱為發佈-訂閱模式
觀察者定義
定義物件一對多關係,當一個物件改變狀態時,所有相依它的物件都會自動被改變。 主題(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. 待續......
留言
張貼留言