观察者设计模式的故事是什么?

6

我在完成一项任务时调查了观察者模式。到目前为止,我的结论是它最初出现在一本由名为“四人帮”的团体撰写的书籍中。

但是我也看到它的第一个实现是基于SmallTalk MVC框架的。

观察者模式有起源吗?谁首先设计了它?四人帮成员中的哪位开发了它?自创建以来,它是否经历了任何变化?

另外,该模式的一些实现包括所谓的“ConcreteSubject”,这是Subject类的一般化。这是模式的变体,还是从原始模型演变而来?

2个回答

8
四人帮对设计模式的主要贡献在于为一些常用的模式命名,以协助表达设计意图。这样写起来就容易多了:

// this is an observer

比起没人会读的一大堆注释,人们更喜欢分享术语,这样开发者之间的沟通就更有效了。
观察者模式早在面向对象编程之前就已经存在了。最常见的方式是使用术语“回调”,在各种语言中通常使用函数指针实现,或者甚至使用标志来表示应该调用哪个函数/过程/子例程。这代表了模块之间最早的抽象通信形式。我甚至看到过在汇编语言中采用类似的方法 - 存储回调地址并使用它来间接通知“某些事情发生了”。
需要记住的一件重要事情是……《设计模式》一书中Gang of Four展示的实现不是“绝对”的——它们只是用于演示一种方法。你可以像使用抽象类、接口或C#委托一样轻松地使用函数指针来实现观察者模式。
(顺便说一下,我在约翰霍普金斯大学教授设计模式课程;))

我收到的最好的解释。非常感谢!只有一个最后的问题。我无法很好地理解将Subject组件泛化为“ConcreteSubject”的原因。这是怎么回事?再次感谢。 - Jota Porras
1
“主题”是一个抽象概念,代表任何想要监听的东西。通常它是一个接口或抽象类,但也可以是非面向对象语言中的函数指针参数定义。ConcreteSubject代表实现主题定义的某个东西;实现/扩展主题的类(或实际函数,你将传递指针给它)。(感谢您的赞美之词!很高兴我能帮助到您) - Scott Stanchfield

1
"Gang of Four并非发明了设计模式,他们观察和研究了当时的软件领域,以便分类记录开发人员面临的常见问题的解决方案。至于最初是谁发明了它,我想你和我一样都不知道。尽管如果有人知道发明者是谁,我会很感兴趣。在我看来,这就像问谁发明了火一样...
ConcreteSubject指实现Subject接口的内容。它不是一种变体,而是必须有一个接口来促进该模式(或者一个超类,但接口更好)"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接