觀察者模式
觀察者模式
Youtube,IG,FB等等很多社群平台,可以讓人訂閱、追蹤
觀察者模式就是類似於這種的模式,是一對多的關係
Youtuberc或網紅可以把最新的消息發送給粉絲們
Youtuber有兩個方法
updateData是Youtuber每次有更新都會呼叫的方法
getVedio與getArticle是getter方法
| Youtuber |
|---|
| getVedio |
| getArticle |
| updateData |
public class Youtuber{
//others code
Fan[] fans = new Fans[]{//code};;
public void updateData(){
for (int i = 0; i < fans.length; i++) {
fans[i].updateVedio(getVedio());
fans[i].updateArticle(getArticle());
}
}
}
關於粉絲數組,程式可以優化成可變動的數組,可以增加一些彈性
目前程式有一些缺點
- 針對具體開發,不是針對介面
- 粉絲有新的資料想要,都必須再次改動上述程式
觀察者模式簡介
有兩個角色
- Youtuber就是發佈者,稱為對象(SUBJECT)
- 觀眾是觀察者(OBSERVER)
對象物件一個對多個觀察者物件
每個消息改變時都會通知所有觀察者訊息
透過註冊,可以讓物件成為觀察者物件
也可以取消註冊,可以使移出觀察者名單
跟我們退訂Youtuber一樣,不會再接收到訊息
觀察者模式類別圖

唯一有資料的是subject
Observe有很多個,但沒資料
唯一有影片的是Youtuber
觀眾很多個,但沒影片,需要Youtuber推送給他們
改變了什麼
剛剛上面寫的Fan粉絲,就要去實作OBSERVER
這樣不管是不是粉絲,還是不小心點到追蹤的老王,Youtuber都可以透過Update方法通知各位,很棒吧
Youtuber只要透過型態為OBSERVER的可變數組,就可以輕鬆的管理全部訂閱用戶
Youtuber也要實作SUBJECT,這樣子訂閱戶不只可以訂閱老高,年輕高也可以喔
這樣子我們一開始實作的缺點耦合,就很鬆了
而且因為透過OBSERVER介面,會規定它們必須實作的方方法,就算以後訂閱戶需要新的資料 也可以比較安全的完成變動
不只如此
由於SUBJECT是唯一有資料的
資料肯定都是私有的
OBSERVER想要資料都要透過SUBJECT推送
有可能會有OBSERVER想要額外資料的時候,在不改變update的前提之下
也是可以增加public的getter方法讓OBSERVER拉取資料
這中間的取捨,就交給自己決定了