設計模式之觀察者模式

2021-10-01 03:53:40 字數 2330 閱讀 3239

.我們以日常生活中的訂牛奶的業務來說明觀察者模式的使用方法。

由上面類圖可以分析得到:物件之間存在一對多關係,牛奶站點就是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 ...