iT邦幫忙

2021 iThome 鐵人賽

DAY 28
3
Software Development

淺談物件導向與Design Pattern介紹系列 第 28

IT鐵人DAY 28-Observer 觀察者模式

  今天要學習的是觀察者模式,它主要的作用是設定一個訂閱機制,當被訂閱的物件有發生事件時就會去通知所有訂閱的物件,現在讓我們來認識它吧!


問題情境與解析

  假設某個影音平台提供用戶可以建立自己的頻道來上傳影片,並提供給此平台所有的用戶觀看,若是用戶對某個頻道很感興趣,可以每天上他的頻道去查看有沒有發布新的影片,有點浪費時間,另外,頻道上傳新的影片後,就會向所有用戶發布通知,有興趣的用戶看到或許會是開心的,但不感興趣的用戶就會覺得非常惱人。

  如果套用觀察者模式,讓此平台提供一個訂閱頻道的服務,當某頻道有上傳新的影片,就會去通知有訂閱此頻道的所有訂閱者,訂閱者本身不用主動去看有訂閱的頻道有沒有發布新的影片,省掉了訂閱者主動去關注的時間,而且通知只會給有訂閱的人,並不會發給沒有訂閱的用戶,因此用戶也不會收到莫名的頻道發布影片的通知。

  以上述的例子,我們可以把頻道視為Publisher,而訂閱者就是Observer,每個Observer會實作相同的介面並且Publisher只會通過此介面與它們溝通,接著在在Publisher中建立一個訂閱機制,可以讓Observer訂閱或是取消訂閱;而當Publisher發布影片的時候,就會去遍歷其訂閱者並調用通知的方法將訊息傳遞給Observer。

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20211013/201407435zn2HoDsmN.png

Skeleton Code

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可以去訂閱或取消訂閱就可以囉!


除此之外,也歡迎大家走走逛逛關於我們團隊夥伴的文章

lu23770127 - SASS 基礎初學三十天

10u1 - 糟了!是世界奇觀!

juck30808 - Python - 數位行銷分析與 Youtube API 教學

SiQing47 - 前端?後端?你早晚都要全端的,何不從現在開始?


上一篇
IT鐵人DAY 27-Visitor 訪問者模式
下一篇
IT鐵人DAY 29-Template Method 模板模式
系列文
淺談物件導向與Design Pattern介紹30

1 則留言

0
juck30808
iT邦新手 3 級 ‧ 2021-10-14 12:35:28

恭喜即將邁入完賽階段~

我要留言

立即登入留言