定义
对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知。
案例
小明非常爱吃,吃得是非常之胖,他的医生小白建议他不要吃多了,但是他始终不听,吃到后面吃穷了。没有钱,但是他又想吃,这时候他就到处借钱。这不借了小黑500元,至今还没有还上。他的医生小白和小黑都那她没有办法,这时候小绿给他们想了一个办法,给了他们几件法宝,一件是Subject法宝,要把它悄悄放在小明的身上,还有两件是Observer法宝,他们各带一个,还有一个Event监控,他们必须根据相应的Event来对小明进行监控,现在有两种监控:一种是吃,一种是买。只要小明一吃东西,小白就知道了。只要小明一买东西,小黑就知道了:“小样还有钱”。
Event提供了添加、删除Observer,当Xiaoming有动作的时候提醒Observer:
class Event
{
public:
void add(Observer* observer);
void remove(Observer* observer);
void notify(Info* info);
private:
vector<Obsever*> m_observers;
};
void Event::add(Obsever* obsever)
{
m_observers.push_back(observer);
}
void Event::notify(Info* info)
{
for(int i = 0; i < m_observers.size(); ++i)
m_observers[i]->update(info);
}
Xiaoming保存了两个事件,一个是吃,是一个买:
class Xiaoming
{
public:
void eat() { m_eatEvent.notify(info); }
void buy() { m_buyEvent.notify(info); }
Event& eatEvent() const { return m_eatEvent; }
Event& buyEvent() const { return m_buyEvent; }
private:
Event m_eatEvent;
Event m_buyEvent;
};
Xiaobai和Xiaohei分别监Xiaoming的吃和买事件:
class Observer
{
public:
virtual void update(Info*) {}
];
class Xiaobai : public Observer
{
public:
virtual void update(Info*) { doSomething(); }
};
class Xiaohei : public Observer
{
public:
virtual void update(Info*) { doSomething(); }
};
Xiaoming xm;
Xiaohei xh;
Xiaobai xb;
xm.eatEvent().add(&xb);
xm.buyEvent().add(&xh);
xm.eat();
xm.buy();
适用性
- 当一个抽象模式有两方面,一个方面依赖另一方面,将这两方面封装在独立的类中,以使它们可以独立的改变。
- 当一个对象需要改变的时候,需要改变其他对象,而又不知道具体有多少个对象。