观察者模式:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并自动更新。
#include <iostream>
#include <list>
//AbstractObserver(抽象观察者)
//——为那些在目标发生改变时需获得通知的对象定义一个更新接口。
class AbstractObserver
{
public:
virtual void update() = 0;
};
//具体观察者
//——维护一个指向具体观察对象的引用;
//——存储有关状态,这些状态应与目标的状态保持一致;
//——实现AbstractObserver的更新接口以使自身状态与目标的状态保持一致。
class Observer1 : public AbstractObserver
{
public:
Observer1()
{
std::cout << "Observer1未被通知,状态不变" << std::endl;
}
virtual void update()
{
std::cout << "Observer1被通知,状态改变" << std::endl;
}
};
class Observer2 : public AbstractObserver
{
public:
Observer2()
{
std::cout << "Observer2未被通知,状态不变" << std::endl;
}
virtual void update()
{
std::cout << "Observer2被通知,状态改变" << std::endl;
}
};
class Observer3 : public AbstractObserver
{
public:
Observer3()
{
std::cout << "Observer3未被通知,状态不变" << std::endl;
}
virtual void update()
{
std::cout << "Observer3被通知,状态改变" << std::endl;
}
};
//AbstractSubject(抽象观察目标)
//——目标知道它的观察者。可以有任意多个观察者观察同一个目标;
//——提供注册和删除观察者对象的接口。
class AbstractSubject
{
public:
//添加观察者
virtual void AddObserver(AbstractObserver* observer) = 0;
//删除观察者
virtual void DeleteObserver(AbstractObserver* observer) = 0;
//通知所有观察者
virtual void NotifyAllObserver() = 0;
};
//具体观察者
//——维护一个指向ConcreteSubject对象的引用;
//——存储有关状态,这些状态应与目标的状态保持一致;
//——实现Observer的更新接口以使自身状态与目标的状态保持一致。
class Subject : public AbstractSubject
{
public:
//添加观察者
virtual void AddObserver(AbstractObserver* observer)
{
ObserverList.push_back(observer);
}
//删除观察者
virtual void DeleteObserver(AbstractObserver* observer)
{
ObserverList.remove(observer);
}
//通知所有观察者
virtual void NotifyAllObserver()
{
for (std::list<AbstractObserver*>::iterator it = ObserverList.begin(); it != ObserverList.end(); it++)
{
(*it)->update();
}
}
//具体观察者列表
std::list<AbstractObserver*> ObserverList;
};
void test()
{
//创建观察者
AbstractObserver* observer1 = new Observer1;
AbstractObserver* observer2 = new Observer2;
AbstractObserver* observer3 = new Observer3;
//创建观察目标
AbstractSubject* subject = new Subject;
//添加观察目标
subject->AddObserver(observer1);
subject->AddObserver(observer2);
subject->AddObserver(observer3);
std::cout << "观察者收到通知" << std::endl;
subject->NotifyAllObserver();
}
int main()
{
test();
return 0;
}
//打印结果:
Observer1未被通知,状态不变
Observer2未被通知,状态不变
Observer3未被通知,状态不变
观察者收到通知
Observer1被通知,状态改变
Observer2被通知,状态改变
Observer3被通知,状态改变
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。