今天要學習的是觀察者模式,它主要的作用是設定一個訂閱機制,當被訂閱的物件有發生事件時就會去通知所有訂閱的物件,現在讓我們來認識它吧!
假設某個影音平台提供用戶可以建立自己的頻道來上傳影片,並提供給此平台所有的用戶觀看,若是用戶對某個頻道很感興趣,可以每天上他的頻道去查看有沒有發布新的影片,有點浪費時間,另外,頻道上傳新的影片後,就會向所有用戶發布通知,有興趣的用戶看到或許會是開心的,但不感興趣的用戶就會覺得非常惱人。
如果套用觀察者模式,讓此平台提供一個訂閱頻道的服務,當某頻道有上傳新的影片,就會去通知有訂閱此頻道的所有訂閱者,訂閱者本身不用主動去看有訂閱的頻道有沒有發布新的影片,省掉了訂閱者主動去關注的時間,而且通知只會給有訂閱的人,並不會發給沒有訂閱的用戶,因此用戶也不會收到莫名的頻道發布影片的通知。
以上述的例子,我們可以把頻道視為Publisher,而訂閱者就是Observer,每個Observer會實作相同的介面並且Publisher只會通過此介面與它們溝通,接著在在Publisher中建立一個訂閱機制,可以讓Observer訂閱或是取消訂閱;而當Publisher發布影片的時候,就會去遍歷其訂閱者並調用通知的方法將訊息傳遞給Observer。
import java.util.ArrayList;
interface Observer {
public void update(State state);
}
class ConcreteObserver implements Observer {
public void update(State state) {
// do something
}
}
class Publisher {
ArrayList<Observer> observers = new ArrayList<Observer>();
private State state;
public void subscribe(Observer o) {
observers.add(o);
}
public void unsubscribe(Observer o) {
observers.remove(observers.indexOf(o));
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(this.state);
}
}
public void updateState(State s) {
this.state = s;
notifyObservers();
}
}
當一個物件有狀態改變,而這個改變可能會需要改變其他物件的時候,或是某些物件需要觀察其他物件的時候,這就可以使用觀察者模式來解決,在Publisher中建立訂閱機制,讓Observer可以去訂閱或取消訂閱就可以囉!
除此之外,也歡迎大家走走逛逛關於我們團隊夥伴的文章
juck30808 - Python - 數位行銷分析與 Youtube API 教學
SiQing47 - 前端?後端?你早晚都要全端的,何不從現在開始?