.我們以日常生活中的訂牛奶的業務來說明觀察者模式的使用方法。
由上面類圖可以分析得到:物件之間存在一對多關係,牛奶站點就是subject(被訂閱的物件),是一的一方, 訂牛奶的使用者就是observer(訂閱物件),是多的一方。
【a】uml類圖
詳細實現**如下:
【b】抽象被觀察者:具有註冊、移除以及通知所有觀察者物件的抽象方法
public inte***ce subject
【c】抽象觀察者:具有統一更新狀態的抽象方法
public inte***ce observer
【d】具體觀察者:即使用者本身
public class usera implements observer
}public class userb implements observer
}
【e】具體被觀察者:內部持有很多觀察者角色物件引用,實現找到所有已訂閱的觀察者,通知他們進行狀態更新。
public class milksubject implements subject
public double getweight()
@override
public void registerobserver(observer observer)
@override
public void removeobserver(observer observer)
@override
public void notifyallobservers()
}/**
* 設定牛奶名稱和重量訊息,並且通知所有觀察者更新狀態
** @param name 名稱
* @param weight 重量
*/public void sendmilk(string name, double weight)
}
【f】客戶端
public class client
}
【g】執行結果
使用觀察者模式在後期如果想動態增加訂閱者就顯得非常方便,只需要增加乙個具體的觀察者物件即可。如下**我們增加乙個userc:
public class userc implements observer
}
然後客戶端新註冊乙個觀察者到被觀察者佇列裡面就可以了:
observable介面就使用到了觀察者模式,乙個 observable 例項改變後,呼叫 observable 的 notifyobservers() 方法的應用程式會通過呼叫觀察者的 update() 方法來通知觀察者該例項發生了改變。
【a】observable:具體的被觀察者角色,此處並沒有抽象被觀察者角色。
public class observable
//註冊觀察者
public synchronized void addobserver(observer o)
}//移除觀察者
public synchronized void deleteobserver(observer o)
//通知所有觀察者
public void notifyobservers()
public void notifyobservers(object arg)
//迴圈遍歷,通知所有觀察者,並且呼叫update()更新狀態
for (int i = arrlocal.length-1; i>=0; i--)
((observer)arrlocal[i]).update(this, arg);
}//...省略
}
【b】抽象觀察者角色:observer
public inte***ce observer
設計模式之觀察者模式
首先說了乙個自己的小例子吧,前兩天我的乙個朋友來找我玩,因為路途比較遠,我需要知道他的位置,然後安排好時間去接他,那麼在這個例子中,我就是乙個觀察者,需要時時刻刻觀察他的位置,我的朋友就是乙個被觀察者。那麼需要知道我朋友的位置,就有兩種方式,第一,我自己打 問,第二,我的朋友告訴我,下面我們來看看這...
設計模式之觀察者模式
一 作用 讓多個觀察者監視某一物件的變化,如果物件變化,則通知所有觀察者。二 例子 抽象主題類 public abstract class subject 移除觀察者 public void detach observer observer 向觀察者 們 發出通知 public void notif...
設計模式之觀察者模式
觀察者模式的定義是 定義物件間的一種一對多的依賴關係。當乙個物件的狀態發生變化時,所有依賴它的物件都會得到通知並自動更新 報社跟讀者的例子 我們用報社和讀者之間的關係來模擬觀察者模式。包含以下主體 報社 news office 讀者介面 reader 具體讀者 reader 二逼青年 reader ...