Observer Pattern
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
的名稱,盡管把想要發布的資訊,更降低了彼些的耦和: