一、意图:
定义对象之间一对多依赖,当被依赖对象的状态改变时,所有依赖对象能自动收到通知和更新自己。
二、应用场景:
- 当一个对象改变时,需要改变其他对象,但并不了解其他对象的数量;
- 当一个对象应当负责通知其他对象的职责实现时,降低通知对象和被通知对象的耦合。
三、缺点:
- 被观察对象状态的更新可能会引起观察者级联更新
四、实例:
COS系统向客户提供优惠信息订阅功能,订阅方式可以是邮箱Email或短信Sms,未来可能会添加社交软件账号Social订阅方式;角色类NewsPublisher实现信息发布业务。如何设计解决该问题?
伪代码:
class NewPublisher{
list<Observer> ol;
State s;
Add(Observer o){
ol.add(o);
}
Remove(Observer o){...}
Notify(){
for(Oberver o:ol)
o.update(s);
}
};
class Observer{
virtual update();
};
class EmailO: public Observer{
update(State s){...}
};
class SmsO: public Observer{...};
class SocialO: public Observer{...};