C# 7.0 观察者模式 以及 delegate 和 event

这里面综合了几本书的资料.

需求

有这么个项目: 

C# 7.0 观察者模式 以及 delegate 和 event

需求是这样的:

一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, 它能从气象站获得这三个数据. 还有三种设备, 可以按要求展示气象站的最新数据.

WeatherData的结构如下:

C# 7.0 观察者模式 以及 delegate 和 event

有3个get方法, 分别获取最新的气温, 湿度和气压. 还有一个measurementsChanged()方法, 当任一传感器有变化的时候, 这个方法都会被调用.

总结一下项目的需求:

WeatherData类有三个get方法可以获取温度, 湿度和气压

如果任何一个数据发生变化, 那么measureChanged()方法就会被调用

我们需要实现这三种显示设备:

  当前天气

  数据统计

  天气预测

系统必须可以扩展, 其他开发者可以创建自定义展示设备.

初版代码

C# 7.0 观察者模式 以及 delegate 和 event

这个地方有个"错误", xxxDisplay都是具体的实现, 而编程规则要求是应该对接口编程而不是对实现编程.

那么什么是观察者模式?

举一个例子:

报社发行报纸

你订阅报纸, 一旦有新一期的报纸发行, 新报纸就会送到你家里, 只要你一直订阅, 你就一直会收到新报纸

你不再订阅报纸的时候, 就收不到以后的新报纸了

报社运营的时候, 一直会有人去订阅或者取消订阅报纸.

发布者 + 订阅者 = 观察者模式
Publishers + Subscribers = Observer Pattern
在观察者模式里, 我们把报社叫做被观察对象(Subject), 把订阅者叫做观察者(Observers)

C# 7.0 观察者模式 以及 delegate 和 event

观察者模式是这样操作的:

C# 7.0 观察者模式 以及 delegate 和 event

C# 7.0 观察者模式 以及 delegate 和 event

C# 7.0 观察者模式 以及 delegate 和 event

C# 7.0 观察者模式 以及 delegate 和 event

  

C# 7.0 观察者模式 以及 delegate 和 event

C# 7.0 观察者模式 以及 delegate 和 event

观察者模式的定义就是:

一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知

类图如下:

C# 7.0 观察者模式 以及 delegate 和 event

 

谈一下松耦合

当两个对象是松耦合的时候, 他们可以进行交互, 但是却几乎不了解对方.
观察者模式下的被观察者(Subject)和观察者(Observers)就是松耦合设计的对象. 这是因为:

被观察者(Subject)只知道观察者实现了某个接口

可以随时添加观察者

添加新类型观察者的时候不需要修改被观察者

可以复用观察者或者被观察者

如果被观察者或观察者发生变化了, 那么这些变化不会影响到对方.

一个设计原则:

交互的对象之间应尽量设计成松耦合的. Strive for loosely coupled designs between objects that interact.
松耦合设计可以让我们设计出这样的系统: 因为对象之间的相互依存减小了, 所以系统可以轻松处理变化.

重新设计:

C# 7.0 观察者模式 以及 delegate 和 event

代码:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfjxd.html