面试被问及到js中的观察者模式,这玩意儿早就了解过,可以说是动态语言中非常有用的一个设计模式,非常惭愧的没有系统的研究过。不过没关系,哪里不会补哪里,立刻动手,用所会的语言都实现一遍。
观察者模式
关于观察者模式,《松本行弘的程序世界》讲的非常清楚:观察者模式是当某个对象状态发生变化时,依存于该状态的全部对象自动得到通知,被观察者和观察者们是一对多的关系。书中还举了一个非常易懂的例子:获取系统当前时间并输出到命令行中。如果要硬编码也很简单,定义一个方法,先获取时间,然后再处理展示。这样获取时间的功能基本就不能复用了,因为带了个处理展示的拖油瓶。
如果用观察者模式则可以这样:定义两个类,一个用于
观察者模式是一种设计模式,它在软件开发中用于处理对象之间的依赖关系,特别是当一个对象的状态发生改变时,需要通知并自动更新与之关联的其他对象。这种模式遵循了一对多的依赖关系,即一个被观察者可以有多个观察者。在给定的标题和描述中,提到的主要语言是Ruby、JavaScript和PHP,我们将分别讨论这三种语言中的观察者模式实现。
Ruby的实现非常简洁,利用了内置的`Observable`模块。`Subject`类通过包含`Observable`模块,获得了观察者模式所需的方法。`Subject`类有一个`notify`方法,当状态变化时,调用这个方法通知所有观察者。`Obs`类作为观察者,实现了`update`方法来响应被观察者的通知。通过`add_observer`添加观察者,并调用`notify`方法来触发通知。
接下来是PHP的实现。`Subject`类拥有一个`_observers`数组来存储观察者,并提供了`add_observer`、`delete_observer`和`notify_observers`方法来管理这些观察者。`Observer`类包含`update`方法,当被观察者调用`notify_observers`时,这个方法会被执行。
JavaScript的实现稍微复杂一些,因为语言本身没有内置的观察者模式支持。我们需要自己创建一个`Subject`对象,包含`observers`数组和相关的方法,如`addObserver`、`removeObserver`和`notifyObservers`。观察者也需要定义一个`update`方法,但JavaScript中可能需要额外的辅助函数来管理数组。
观察者模式的核心在于解耦合,使得被观察者和观察者之间只有最小的交互,降低了系统的复杂性和维护成本。在上述的实现中,当被观察者的状态发生变化时,它只需要通知所有观察者,而无需关心观察者如何处理这个变化,这极大地提高了代码的灵活性和可扩展性。
在实际应用中,观察者模式常用于事件驱动编程,例如用户界面的事件处理、订阅/发布系统、以及状态机等场景。通过观察者模式,我们可以轻松地添加或移除观察者,而不会影响到被观察者或其他观察者的行为。
无论是在Ruby、JavaScript还是PHP中,观察者模式都是通过维护一个观察者列表,并在状态变化时通知这些观察者来实现的。这种模式是面向对象设计中的一个重要概念,对于理解和构建可维护的、松散耦合的系统至关重要。通过学习和实践不同语言的实现,开发者可以更好地掌握这一模式,并将其应用于实际项目中。