一、定义
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
在这里先讲一下面向对象设计的一个重要原则——单一职责原则。因此系统的每个对象应该将重点放在问题域中的离散抽象上。因此理想的情况下,一个对象只做一件事情。这样在开发中也就带来了诸多的好处:提供了重用性和维护性,也是进行重构的良好的基础。几乎所有的设计模式都是基于这个基本的设计原则来的。
观察者模式(又被称为发布-订阅(Publish/Subscribe)模式。说到发布订阅,最熟悉的就是我们的微信公众号了,那就用这个来举例子:
观察者模式的简单实现
假设微信用户就是观察者,微信公众号是被观察者,有多个的微信用户关注了程序猿这个公众号,当这个公众号更新时就会通知这些订阅的微信用户。
先实现微信公众号的类
|
|
接下来设置用户类
|
|
然后进行订阅发布
|
|
观察者模式优缺点
优点:
我们作为订阅者不必每次都去查看这个公众号有没有新文章发布, 公众号作为发布者会在合适时间通知我们
我们与公众号之间不再强耦合在一起。公众号不关心谁订阅了它,
不管你是男是女还是宠物狗,它只需要定时向所有订阅者发布消息即可可以广泛应用于异步编程,它可以代替我们传统的回调函数
我们不需要关注对象在异步执行阶段的内部状态,我们只关心事件完成的时间点
缺点:
- 在应用观察者模式时需要考虑一下开发效率和运行效率的问题,程序中包括一个被观察者、多个观察者,开发、调试等内容会比较复杂
- 由于JavaScript单线程异步机制,即使一个观察者卡顿了,也不会影响整体的执行效率。(多线程同步便会阻塞)
总结
观察者模式有两个明显的优点
- 时间上解耦
- 对象上解耦
关于观察者模式,在浏览器和Node都有良好的事件机制支持,不必自己实现,本文只是简单了解。