我是一名高级开发人员,但我没有接受过大量的正式培训,虽然我使用过很多设计模式,并且在我作为开发人员的这些年看到它们使用过,但没有人真的特意去说。“哦,这是一个观察者模式,或者这是一个单例模式。”
阅读了一些设计模式,我遇到了观察者模式,它似乎与 .NET 框架事件的工作方式非常相似。我错过了一些基本的东西吗?
我是一名高级开发人员,但我没有接受过大量的正式培训,虽然我使用过很多设计模式,并且在我作为开发人员的这些年看到它们使用过,但没有人真的特意去说。“哦,这是一个观察者模式,或者这是一个单例模式。”
阅读了一些设计模式,我遇到了观察者模式,它似乎与 .NET 框架事件的工作方式非常相似。我错过了一些基本的东西吗?
.NET 事件模型几乎是公共语言运行时中观察者模式的集成实现。.NET 语言直接以特定语言的方式实现观察者,使用框架对此的内置支持。
在大多数编程语言中,观察者模式需要定制的开发或库。
它作为 C#、VB.NET 和大多数其他使用 CLR 构建的语言的语言的一部分免费提供。
来自MSDN
熟悉 FCL 中公开的类型的人会注意到,框架中不存在 IObserver、IObservable 或 ObservableImpl 类型。它们缺席的主要原因是 CLR 使它们在一段时间后过时了。虽然您当然可以在 .NET 应用程序中使用这些构造,但委托和事件的引入提供了一种新的、强大的方法来实现观察者模式,而无需开发专用于支持该模式的特定类型。事实上,由于委托和事件是 CLR 的一等成员,因此这种模式的基础被合并到 .NET Framework 的核心中。因此,FCL 在其结构中广泛使用了观察者模式。
许多事件模型,如 Java 1.1 及更高版本,以及 .NET 事件模型,基本上都是观察者模式的实现。
请注意,这甚至适用于较旧的机制,例如在 C 中使用回调方法进行事件处理。这是相同的意图,只是实现方式略有不同。
为什么你认为一定有区别?
您不认为 .NET 设计人员也阅读设计模式吗?
实际上,观察者模式(就像本书中的所有内容一样)早在 Gof4 对其进行分类和命名之前就已为人所知。它用于实现 .Net 事件模型,以及 Win32 和 Win16 事件模型,可能还有许多其他事件模型。