观察者模式【C++版】

一、定义观察者类

   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;
}

 运行结果:

posted @ 2011-09-06 16:58  edisonfeng  阅读(463)  评论(0编辑  收藏  举报