一、定义观察者类
a)观察者基类
enum ObservedStatus {Dining, Sleeping, Working};
/*******************************定义多个观察者类*************************************/
//定义观察者的父类(抽象类,实际作用相当于java中的接口)
class Observer
{
public:
virtual void update(ObservedStatus status)=0;
virtual ~Observer() {}//保证父类指针指向子类时,delete基类指针,子类的析构行为能正确调用
};
b)具体观察者类
class DiningObserver: public Observer
{
void update(ObservedStatus status)//只需要实现观察者父类中update虚函数
{
if (status == Dining) {
cout<<"我是观察者DiningObserver,当前被观察者的状态为:Dining!"<<endl;
}else{
cout<<"我是观察者DiningObserver,但状态不匹配"<<endl;
}
}
};
class SleepingObserver: public Observer
{
void update(ObservedStatus status)//只需要实现观察者父类中update虚函数
{
if (status == Sleeping) {
cout<<"我是观察者SleepingObserver,当前被观察者的状态为:Sleeping!"<<endl;
}else{
cout<<"我是观察者SleepingObserver,但状态不匹配"<<endl;
}
}
};
class WorkingObserver: public Observer
{
void update(ObservedStatus status)//只需要实现观察者父类中update虚函数
{
if (status == Working) {
cout<<"我是观察者WorkingObserver,当前被观察者的状态为:Working!"<<endl;
}else{
cout<<"我是观察者WorkingObserver,但状态不匹配"<<endl;
}
}
};
二、定义被观察者类
a)被观察者基类
/*******************************定义被观察者类*************************************/
class ObservedBase//被观察者基类
{
public:
virtual void addObserver(Observer *observer)=0;//添加观察者
virtual void removeObserver(Observer *observer)=0;//删除观察者
virtual void notifyToObservers()=0;//将自身信息通知观察者
};
b)实际被观察者类
class Observed:public ObservedBase
{
public:
Observed(ObservedStatus _status)//构造函数
{
status=_status;
}
void addObserver(Observer *observer)//添加某个观察者
{
observersList.push_back(observer);
}
void removeObserver(Observer *observer)//移除某个观察者
{
observersList.remove(observer);
}
void notifyToObservers()//通知所有观察者
{
for (list<Observer*>::iterator it = observersList.begin();
it!= observersList.end(); ++it)
{
Observer* theObserver = *it;
theObserver->update(status);
}
}
private:
list<Observer*> observersList;
ObservedStatus status;
};
三、主函数调用
int main()
{
cout<<"测试程序:"<<endl;
Observer *FirstObserver=new DiningObserver();
Observer *SecondObserver=new SleepingObserver();
Observer *ThirdObserver=new WorkingObserver();
Observed *myObserved=new Observed(Working);
myObserved->addObserver(FirstObserver);
myObserved->addObserver(SecondObserver);
myObserved->addObserver(ThirdObserver);
myObserved->notifyToObservers();//通知所有观察者
cout<<endl;
cout<<"从列表中移除观察者SleepingObserver后再通知:"<<endl<<endl;
myObserved->removeObserver(SecondObserver);//移除第二个观察者SleepingObserver
myObserved->notifyToObservers();//通知所有观察者
delete FirstObserver;
delete SecondObserver;
delete ThirdObserver;
system("pause");
return 0;
}
运行结果: