[design pattern] Observer 模式:讓你的系統具備超強感應力

Observer 模式:讓你的系統變身為超級偵探

想像一下,如果你的系統能夠像福爾摩斯一樣,對任何細微的變化都瞬間做出反應,那會是多麼酷的一件事!這就是 Observer 模式要帶給我們的超能力。它讓你的系統變得既敏感又靈活,能夠在關鍵時刻立即通知所有相關方。讓我們一起來探索這個神奇的設計模式吧!

1. Observer 模式是什麼?

簡單來說,Observer 模式就像是一個訂閱系統:

  1. 被觀察者(明星):就像是大明星,負責發布最新動態。
  2. 觀察者(粉絲):就是關注明星的粉絲,隨時準備接收最新消息。
  3. 通知機制(社交媒體):當明星有新動態時,社交媒體立即推送消息給所有粉絲。

2. 為什麼要用 Observer?

Observer 模式在很多場景下都能大顯身手:

  1. 新聞訂閱系統:讓用戶即時收到最新新聞,再也不怕錯過重要資訊。
  2. 股票交易平台:當股價變動時,立即通知所有關注該股票的投資者。
  3. 遊戲開發:當遊戲狀態改變時,及時更新所有相關的遊戲元素。

3. Observer 模式實戰:打造一個超級新聞訂閱系統

來看看如何用 Observer 模式實現一個炫酷的新聞訂閱系統:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class NewsCategory {
constructor(categoryName) {
this.categoryName = categoryName;
this.subscribers = [];
this.latestNews = null;
}

subscribe(observer) {
if (!this.subscribers.includes(observer)) {
this.subscribers.push(observer);
console.log(`${observer.username} 訂閱了 ${this.categoryName} 類別的新聞`);
}
}

unsubscribe(observer) {
this.subscribers = this.subscribers.filter(sub => sub !== observer);
console.log(`${observer.username} 取消訂閱了 ${this.categoryName} 類別的新聞`);
}

notify() {
for (const subscriber of this.subscribers) {
subscriber.update(this.latestNews);
}
}

publish(news) {
this.latestNews = `${this.categoryName}: ${news}`;
console.log(`發布新聞:${this.latestNews}`);
this.notify();
}
}

class User {
constructor(username) {
this.username = username;
}

update(news) {
console.log(`${this.username} 收到新聞: ${news}`);
}
}

// 使用示例
const sportsNews = new NewsCategory('體育');
const user1 = new User('小明');
const user2 = new User('小華');

sportsNews.subscribe(user1);
sportsNews.subscribe(user2);

sportsNews.publish('台灣隊奧運奪金!');

sportsNews.unsubscribe(user1);

sportsNews.publish('世界盃比賽結果出爐');

4. Observer 模式的實際應用場景

  1. 即時通訊軟體

    • 當有新消息時,立即通知所有在線用戶。
    • 群組聊天中,一個人發消息,所有群成員都能收到通知。
  2. 物聯網設備監控

    • 當智能家電狀態改變時(如溫度超標),立即通知家庭成員或維修系統。
  3. 社交媒體平台

    • 當你關注的人發布新動態時,你會立即收到通知。
  4. 電子商務平台

    • 當商品降價或庫存狀態改變時,通知關注該商品的用戶。
  5. 任務管理系統

    • 當項目狀態更新時,自動通知所有相關團隊成員。

5. Observer 模式的注意事項

  1. 性能考慮:當觀察者很多時,通知過程可能會耗時。考慮使用異步通知或批量處理。
  2. 內存管理:記得在觀察者不再需要時取消訂閱,避免內存洩漏。
  3. 循環依賴:小心處理觀察者和被觀察者之間可能的循環依賴問題。
  4. 線程安全:在多線程環境中使用時,要確保通知過程的線程安全。

結論

Observer 模式就像給你的系統裝上了一雙火眼金睛,讓它能夠敏銳地察覺任何變化並迅速做出反應。無論是在開發新聞訂閱系統、即時通訊軟體,還是物聯網應用中,Observer 模式都能讓你的系統變得更加靈活和及時。下次遇到需要建立一對多依賴關係的場景時,不妨試試這個超級實用的設計模式吧!


[design pattern] Observer 模式:讓你的系統具備超強感應力
https://terryyaowork.github.io/designpattern/20240901/65878994/
作者
Terry Yao
發布於
2024年9月1日
許可協議