由来
OO开发的一个主导原则是给对象正确地分配职责
一个对象只应做一件事,而且要将它做好
提高重用性和可维护性
正确划分任务重要的领域是用户界面和基础业务逻辑间的交互
更改用户界面不会对应用程序的其他部分产生连带影响
业务要求也可能会发生变化
这一切与用户界面无关
两组要求都会发生变化
自GUI 出现以后开发的很多面向对象的框架均支持将用户界面从应用程序的其他部分中划分出来
将系统分割成一系列相互协作的类有也存在一些不足:
1. 需要维护相关对象间的一致性
2. 为维持一致性而使各类紧密耦合,可能降低其可重用性
没有理由限定依赖于某数据对象的对象数目, 对相同的数据对象可以有任意数目的不同用户界面。
意图和动机
意图
定义对象间的一种一对多的依赖关系
当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
动机
建立一种对象与对象之间的依赖关系
一个对象发生改变时将自动通知其他对象
其他对象将相应做出反应
两个概念,观察者和被观察者
一个对象可以被多个“观察者”所观察
“被观察者”与“观察者”是一个一对多的关系
“被观察者”中会有一个“观察者”的集合,注册“观察者”
适用场合
当一个抽象模型有两个方面, 一方面依赖于另一
方面。将二者封装在独立对象中以使它们可以独立被改变和复用
一个对象的改变需要同时改变其它对象, 但不知
道具体有多少对象有待改变
当一个对象必须通知其它对象,而它又不能假
定其它对象是谁。换言之, 不希望这些对象紧密耦合
例:
效果
Observer模式允许你独立的改变目标和观察者
优点
Subject和Observer之间松偶合,可以各自独立改变
Subject在发送广播通知时,无须指定具体的Observer,Observer可以自己决定是否要订阅Subject的通知
高内聚、低偶合
缺点
松偶合导致代码关系不明显,有时可能难以理解
一个Subject被大量订阅,广播通知时可能会有效率问题