2013-05-17 34 views
5

我一直在调查有关任务的观察者模式。到目前为止,我已经得出结论,它首先出现在一群名为“四人帮”的人写的书中。观察者设计模式的故事是什么?

但我也读了它的第一个实现是在一个基于SmallTalk MVC的框架中。

是否有观察者模式的起源?谁设计的? GoF的哪些成员做到了?自创建以来它有过任何变化吗?

此外,该模式的某些实现包括他们称之为“ConcreteSubject”,它是Subject类的泛化。这是模式的变体,还是原始模型的演变?

回答

8

四人帮对设计模式的主要贡献实际上是给一些常用的模式命名,以协助设计意图的沟通。这是很容易写

// this is an observer 

比没有人会读的大ol评论块。如果人们分享这个术语,开发人员可以更有效地沟通。

观察者模式早在OO编程之前就已经存在了。大多数情况下,它使用术语“回调”来引用,通常用各种语言的函数指针来实现,或者甚至可以使用标志来指示应该调用哪个函数/过程/子例程。这代表了模块之间抽象通信的最早形式之一。我甚至看到了汇编语言采用的类似方法 - 存储回调地址并使用它来间接通知“发生了什么”。

要记住一件大事......四人帮在设计模式书中展示的实现不是“绝对”的 - 他们在那里展示一种方法。您可以像使用抽象类,接口或C#委托一样轻松地使用函数指针来实现Observer模式。

(我在约翰霍普金斯大学教设计模式当然,顺便说一句;))

+0

我还没有得到最好的解释。非常感谢!只有最后一个问题。我无法很好地理解将Subject组件概括为“ConcreteSubject”的原因。那是什么?再次感谢。 –

+1

“主题”是一个抽象,代表任何想听的东西。它通常是一个接口或抽象类,但也可以是非OO语言中的函数指针参数定义。 ConcreteSubject代表实现主题定义的东西;实现/扩展主题的类(或者将要传递指针的实际函数)。 (谢谢你的好话!很高兴我能帮忙) –

1

“四人帮”所做的不是发明模式,他们在当时观察和研究软件领域,以便将解决方案归为开发人员面临的常见问题。

至于谁最初发明它,你的猜测和我想的一样好。尽管如果有人知道谁发明了它,我会感兴趣。在我看来,这就像问谁发明了火...

ConcreteSubject指的是Subject接口的实现。这不是一个变体,它只是有必要有一个接口来促进模式。 (或超级类,但接口更好)。