Observer - 观察者模式

定义
对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知。

案例
小明非常爱吃,吃得是非常之胖,他的医生小白建议他不要吃多了,但是他始终不听,吃到后面吃穷了。没有钱,但是他又想吃,这时候他就到处借钱。这不借了小黑500元,至今还没有还上。他的医生小白和小黑都那她没有办法,这时候小绿给他们想了一个办法,给了他们几件法宝,一件是Subject法宝,要把它悄悄放在小明的身上,还有两件是Observer法宝,他们各带一个,还有一个Event监控,他们必须根据相应的Event来对小明进行监控,现在有两种监控:一种是吃,一种是买。只要小明一吃东西,小白就知道了。只要小明一买东西,小黑就知道了:“小样还有钱”。


Event提供了添加、删除Observer,当Xiaoming有动作的时候提醒Observer:
  
  
  1. class Event
  2. {
  3. public:
  4. void add(Observer* observer);
  5. void remove(Observer* observer);
  6. void notify(Info* info);
  7. private:
  8. vector<Obsever*> m_observers;
  9. };
  10. void Event::add(Obsever* obsever)
  11. {
  12. m_observers.push_back(observer);
  13. }
  14. void Event::notify(Info* info)
  15. {
  16. for(int i = 0; i < m_observers.size(); ++i)
  17. m_observers[i]->update(info);
  18. }
Xiaoming保存了两个事件,一个是吃,是一个买:
   
   
  1. class Xiaoming
  2. {
  3. public:
  4. void eat() { m_eatEvent.notify(info); }
  5. void buy() { m_buyEvent.notify(info); }
  6. Event& eatEvent() const { return m_eatEvent; }
  7. Event& buyEvent() const { return m_buyEvent; }
  8. private:
  9. Event m_eatEvent;
  10. Event m_buyEvent;
  11. };

Xiaobai和Xiaohei分别监Xiaoming的吃和买事件:
   
   
  1. class Observer
  2. {
  3. public:
  4. virtual void update(Info*) {}
  5. ];
  6. class Xiaobai : public Observer
  7. {
  8. public:
  9. virtual void update(Info*) { doSomething(); }
  10. };
  11. class Xiaohei : public Observer
  12. {
  13. public:
  14. virtual void update(Info*) { doSomething(); }
  15. };
    
    
  1. Xiaoming xm;
  2. Xiaohei xh;
  3. Xiaobai xb;
  4. xm.eatEvent().add(&xb);
  5. xm.buyEvent().add(&xh);
  6. xm.eat();
  7. xm.buy();
适用性
  • 当一个抽象模式有两方面,一个方面依赖另一方面,将这两方面封装在独立的类中,以使它们可以独立的改变。
  • 当一个对象需要改变的时候,需要改变其他对象,而又不知道具体有多少个对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值