观察者模式的通知方式
有两种不同的方式可以通知观察者在主题中发生的变化。它们可以被分为推模型或拉模型。
拉模型
在拉模型中,观察者扮演积极的角色。
1、每当发生变化时,主题都会向所有已经注册的观察者进行广播。
2、出现变化时,观察者负责获取相应的变化情况,或者从订户哪里拉取数据
3、拉模型的效率较低,因为它涉及两个步骤,第一步,主题通知观察者;第二步,观察者从主题那里提取所需的数据
推模型
在推模型中,主题是起到主导作用的一方,如下所示。
1、与拉模型不同,变化由主题推送到观察者的
2、在拉模型中,主题可以向观察者发送详情的信息(即使可能不需要)。当主题发送大量观察者用不到的数据时,会使响应时间过长。
3、由于主题发送所需的数据,所以能够提高性能
松耦合与观察者模式
松耦合使软件开发应该采用的重要设计原理之一。松耦合的主要目的使争取在彼此交互的对象之间实现松散耦合设计。耦合是指一个对象对于其交互的其他对象的了解程度。
松耦合设计允许我们构建灵活的面向对象的系统,有效应对各种变化,因为它们降低了多个对象之间的依赖。
松耦合架构具有以下特性:
1、它降低了在一个元素内发生的更改可能对其他元素产生意外影响的风险;
2、它使得测试/维护和故障排除工作更加简单;
3、系统可以轻松地分解为可定义的元素
观察者模式提供了一种实现主题和观察者松耦合的对象设计模式。以下几条可以更好地解释这一点。
1、主题对观察者唯一的了解就是它实现一个特定的接口。同时,它也不需要了解具体观察者类。
2、可以随时添加任意的新观察者
3、添加新的观察者时,根本不需要修改主题
4、观察者或主题没有绑定在一起,所以可以彼此独立使用
5、主题或观察者中的变化不会相互影响。由于两者都是独立的或松散耦合的,所以它们可以自由地做出自己的改变
观察者模式的优点和缺点
优点:
1、它使彼此交互的对象之间保持松耦合;
2、它使得我们可以在无需对主题或观察者进行任何修改得情况下高效地发送数据到其他对象
3、可以随时添加/删除观察者
缺点:
1、观察者接口必须由具体观察者实现,而这涉及继承。无法进行组合,因为观察者接口可以实例化
2、如果实现不当得话,观察者可能会增加复杂性,并导致性能降低
3、在软件应用程序中,通知有时可能不可靠的,并导致竞争条件或不一致性