事件是观察者模式的编译器实现。而且我认为在接口中添加一些设计模式实现的合同不是很合乎逻辑。所以似乎在界面中添加事件可能是不好的做法。这样对吗?
3 回答
当然,有些对象只是“多事”。我想到的是 MVVM 中的视图模型之类的东西。重要的是他们实现了一个事件,让视图知道什么时候发生了变化,以便可以更新视图。(请参阅INotifyPropertyChanged。)
许多其他的东西也需要能够引发事件,比如套接字侦听器。可以想象一个泛化监听器的接口,它的主要成员是一个新连接的事件,也可能是一个新数据到达的事件。
更广泛地说,仅仅因为设计模式提出了一些建议,就没有理由不在接口中定义它。事实上,许多人会将其视为这样做的邀请。我的建议是做最有意义的事情,无论它是否符合设计模式。
我认为在界面中包含事件完全有道理。
如果您的服务在其合同中公开了一种通知客户的方式,为什么不呢?
什么是替代方案?定义回调接口并将其注册到服务中?这是 GoF 书中观察者的规范实现,您似乎没有将特定模式实现推送给用户的问题(请注意,向用户展示的内容始终很重要,而不是实现 - 实现不会自己写)。
事件不是观察者模式的编译器实现,而是该模式的语言和框架实现。因此,它是 .NET 框架和 C# 语言的一流成员。这就是为什么我不担心在接口中使用它们的原因——它们是语言的一部分,无法隐藏。
属性也是如此。它们也是一种设计模式,将 getter/mutator 方法隐藏在简单的语义后面。但是我们仍然在接口中使用它们。
不要害怕抽象。好的模式被使用,因此它们沉入基础设施并变得透明。这是好事。