97

在我看來,GOF中描述的觀察者設計模式與在各種工具包中發現的聽衆真的是一回事。這些概念之間是否存在差異,或者聽衆和觀察者是否真的是同一事物。我不是在尋找任何特定的計算機語言實現,我只是想從設計的角度來理解差異(如果有的話)。是的,我知道SOF上有類似的問題有幾個答案,但是,它們植根於特定語言的具體問題 - 我在尋找設計答案,而不是語言答案。)觀察者設計模式vs「聽衆」

+14

在前者中,一個代碼監視另一個移動代碼,而後一個代碼監聽另一個代碼中的任何噪聲。 – 2010-07-29 01:45:13

+2

GOF代表什麼? – dekaru 2015-11-26 17:25:03

+5

@dekaru四人幫:https://en.wikipedia.org/wiki/Design_Patterns – bitsoflogic 2016-01-11 20:14:36

回答

44

術語「監聽者」是否指代觀察者模式將取決於上下文。例如,Java Swing的「事件監聽器」是觀察者模式實現的一部分,而.Net「跟蹤監聽器」則不是。

框架作者爲參與給定模式實現的組件分配不同名稱並不罕見,但官方模式名稱通常在討論模式本身時使用。

關於設計,給定模式的實現往往會受到所用語言和平臺的影響。因此,給定框架內的觀察者模式的特定實現(可能碰巧使用術語「監聽者」來描述ConcreteObserver的角色)可能與設計模式書中描述的略有不同。

3

一個偵聽器很可能是觀察者模式的實現。偵聽器本質上是等待事件發生在給定的對象上,這是觀察者所做的事情。

我發現你不是在語言特定的答案之後,但在抽象中很難談論這個東西。因此,如果我想在.NET中進行調查,我傾向於在.NET Reflector中打開一個包含偵聽器的程序集,這將允許我拆卸程序集並根據設計模式檢查其邏輯。

18

Gamma等人對設計模式中觀察者的描述存在雙向性。人。 (GOF)。

在他們對Observer的描述中,ConcreteObservers中的一個可能會對其主題發出變化。擁有所有具體觀察者列表的主體然後通知其列表。所有ConcreteObservers,包括原動機,然後適當地作出反應。

聽衆的常見實現似乎都對來自外部的事件做出反應。

所以,我會說聽衆是一個不太普遍的觀察者案例。