敏捷软件开发 - 原则、模式与实践 —— 设计模式(八)OBSERVER模式

本文为敏捷软件开发 - 原则、模式与实践系列的一部分。

本文对应原书第24章

敏捷软件开发 - 原则、模式与实践 —— 设计模式(八)OBSERVER模式

上图展示了OBSERVER模式的规范形式。在本例中,Clock被DigitalClock观察。DigitalClock通过Subject接口注册到Clock中。无论任何原因,只要时间一改变,Clock就调用Subject的notify方法。而Subject的notify方法会调用每个已注册Observer对象的update方法。因此,每当时间发生变化时,DigitalClock都会接收到一个update消息。此时,它会向Clock请求时间,然后把时间显示出来。

OBSERVER模式有两种主要模型。上图展示了拉模型。因为DigitalClock在收到update消息后,必须 要从Clock对象中“拉出”时间信息。拉模型的优点是他实现起来比较简单,并且Subject类和Observer类可以成为库中的标准可重复元素。但有时并不清楚要拉那些数据,这时需要推模型

敏捷软件开发 - 原则、模式与实践 —— 设计模式(八)OBSERVER模式
上图展示了推模型OBSERVER模式的结构。请注意,notify方法和update方法都带有一个参数。该参数是一个提示,它是通过notify方法和update方法从Employee传到SalaryObserver的。这个提示让SalaryObserver知道了雇员记录遭受了哪种变化。EmployeeObserverHint参数可能是某种枚举、一个字符串或者一个包含了某个字段新、老值得复杂数据结构。不管它是什么,它的值都被推到观察者中。

要选择哪种OBSERVER模型完全取决于被观察对象的复杂性。如果被观察对象比较复杂,并且观察者需要一个提示,那么推模型是合适的。如果被观察的对象比较简单,那么拉模型就很合适。

完整内容请查看敏捷软件开发 - 原则、模式与实践系列