介绍
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
参与者
- Subject 目标
- Observer 观察者
- ConcreteSubject 目标具体实现
- ConcreteObserver 观察者具体实现
实现代码
class Subject;
class Observer{
public:
virtual void Update() = 0;
};
class Subject{
public:
virtual void AddObserver(Observer* o)=0;
virtual void DelObserver(Observer* o)=0;
virtual void setState(int a) = 0;
virtual int getState() = 0;
};
class ConcreteSubject : public Subject {
public:
void AddObserver(Observer* o) override
{
l.push_back(o);
}
void DelObserver(Observer* o) override
{
l.remove(o);
}
void setState(int a)
{
state = a;
NotifyAll();
}
int getState() override
{
return state;
}
private:
void NotifyAll()
{
for(auto item : l)
{
item->Update();
}
}
int state = 0;
std::list<Observer *> l;
};
class ObserverA:public Observer{
public:
explicit ObserverA(Subject *subject1)
{
subject = subject1;
this->subject->AddObserver(this);
}
void Update() override
{
std::cout<<"Update A After Subject State Changed To "<<subject->getState()<<std::endl;
}
private:
Subject *subject;
};
class ObserverB:public Observer{
public:
explicit ObserverB(Subject *subject1)
{
subject = subject1;
this->subject->AddObserver(this);
}
void Update() override
{
std::cout<<"Update B After Subject State Changed To "<<subject->getState()<<std::endl;
}
private:
Subject *subject;
};
int main()
{
Subject *subject = new ConcreteSubject();
Observer *a = new ObserverA(subject);
Observer *b = new ObserverB(subject);
subject->setState(22);
std::cout<<"------------------------------------------"<<std::endl;
subject->setState(35);
return 0;
}
输出结果
Update A After Subject State Changed To 22
Update B After Subject State Changed To 22
------------------------------------------
Update A After Subject State Changed To 35
Update B After Subject State Changed To 35
特点
- 观察者和被观察者是抽象耦合的
- 建立一套触发机制
- 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间
- 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃
参考
- 《设计模式:可复用面向对象软件开发的基础》
- http://www.runoob.com/design-pattern/observer-pattern.html