Observer Pattern

Jayson Chiang
Apr 10, 2021

Observer Pattern 目的是讓多個物件(稱之為觀察者,Observer)可以接收單一來源(稱之主題,Subject)的訊息(Message)。每次派送(Publish)的訊息觀察者要不要使用,Subject一點也不在意;Subject只負責把Message送給所有訂閱(Subscribe)的Observer。

這種訂閱與派送的模式,也有人稱之為Pub/Sub。也有人說它們不一樣,就我來看機制是一樣的,而且設計的目的都是讓兩個實體解耦,只是實作上不同的而已。

我們要設計兩個物件,一個可被訂閱的 Observer;另一個是可以註冊這些 Observer 的發行者(Publisher),習慣上將這物件稱之為 Subject (主題)。

開發這個模式前,先定義好要可以讓 Subject 執行的 method 名稱,然後 Observer 會實作這個 method ,命名上用 update(message) 較好理解。所以 Observer 會長得像這樣:

上面的例子,joe 和 jayson都是 Observer ,可以各自實作當 Subject 執行 update 的時侯,收到的 message 要做什麼。

所以 Subject 至少有2個方法要實作,一是用來註冊Observer 的 subscribe(observer) ,二是派送訊息的 notify(message) ;並且有1個屬性 observers 用來儲存已經註冊的Observer 。

這樣就是最簡單的 Observer Pattern 了,執行起來會像這樣

subject.subscribe(joe);
subject.subscribe(jay);
subject.notify('news paper'); // => "Joe receive news paper"
// => "Jay read news paper"
subject.notify('magzine'); // => "Joe receive magzine"
// => "Jay read magzine"

每個 Observer 和 Publisher 之間唯一相依的部分就是一開始要定義的 update(message)

如果不在開發期間定義 update(message) ,而是Observer連同 method 一起註冊,Publisher 執行notify 的時侯,就不用在意 method的名稱,盡管把想要發布的資訊,更降低了彼些的耦和:

--

--