为实现上面的功能,定义以下类。
点击(此处)折叠或打开
- class observer{
- public:
- virtual ~observer();
- virtual void update(subject *psub)=0;
- virtual void printinfo()=0;
- protected:
- observer();
- state _st;
- private:
- };
- class observer_ruoxi:public observer{//马尔泰.若曦
- public :
- virtual subject *getsubject();
- observer_ruoxi(subject* psub);
- virtual ~observer_ruoxi();
- void update(subject *psub);
- void printinfo();
- private:
- subject *_psub;
- };
- class observer_lidequan:public observer{//太监李德全
- public :
- virtual subject *getsubject();
- observer_lidequan(subject* psub);
- virtual ~observer_lidequan();
- void update(subject *psub);
- void printinfo();
- private:
- subject *_psub;
- };
class subject;来解决互用问题
class observer{
//此处用到subject 类
};
class subject {
//此处用到了observer类
};
点击(此处)折叠或打开
- class observer;//类的前置声明
- class subject{//被观察者 皇上
- public :
- virtual ~subject();
- virtual void attach(observer* pobv);
- virtual void detach(observer* pobv );
- virtual void notify();
- virtual void set_state(const state &st)=0;//const 表明入参是不可被修改的
- virtual state getstate()=0;
- protected:
- subject();
- private:
- list<observer*>*_pobvs;//使用list维护观察者
- };
下面是各个类的功能实现
点击(此处)折叠或打开
- //被观察者subject.cpp
- /*
- * subject.cpp
- *
- * Created on: Nov 27, 2012
- * Author: root
- */
- #include "subject.h"
- #include <iostream>
- #include <list>
- subject::subject(){
- _pobvs=new list<observer*>;
- }
- subject::~subject(){
- }
- void subject::attach(observer *pobv){
- _pobvs->push_front(pobv);
- }
- void subject::detach(observer*pobv){
- if(pobv != NULL)
- _pobvs->remove(pobv);
- }
- void subject::notify(){
- list<observer*>::iterator it;
- it=_pobvs->begin();
- for(;it!=_pobvs->end();it++){
- (*it)->update(this);
- }
- }
- concretesubject::concretesubject(){
- _st='\0';
- }
- concretesubject::~concretesubject(){
- }
- state concretesubject::getstate(){
- return _st;
- }
- void concretesubject::set_state(const state & st){
- _st=st;
- }
点击(此处)折叠或打开
- //观察者类的实现observer.cpp
- /*
- * observer.cpp
- *
- * Created on: Nov 27, 2012
- * Author: root
- */
- #include "observer.h"
- #include
- using namespace std;
- observer::observer(){
- _st='\0';
- }
- observer::~observer(){
- //do nothing
- }
- observer_ruoxi::observer_ruoxi(subject *psub){
- _psub=psub;
- _psub->attach(this);
- }
- observer_ruoxi::~observer_ruoxi(){
- _psub->detach(this);
- if(_psub !=0)
- delete _psub;
- }
- void observer_ruoxi::printinfo(){
- cout<<"若曦获悉皇上: "<<_psub->getstate()<
- }
- void observer_ruoxi::update(subject* psub){
- _st=psub->getstate();
- printinfo();
- }
- subject* observer_ruoxi::getsubject(){
- return _psub;//倘若由一个虚函数未写,比如此函数,即使不写也应该在类中加上函数体。这编译器会报错 undefined reference to `vtable for
- }
- observer_lidequan::observer_lidequan(subject *psub){
- _psub=psub;
- _psub->attach(this);
- }
- observer_lidequan::~observer_lidequan(){
- _psub->detach(this);
- if(_psub !=0)
- delete _psub;
- }
- void observer_lidequan::printinfo(){
- cout<<"李德全获悉皇上: "<<_psub->getstate()<
- }
- void observer_lidequan::update(subject* psub){
- _st=psub->getstate();
- printinfo();
- }
- subject* observer_lidequan::getsubject(){
- return _psub;
- }
点击(此处)折叠或打开
- /*
- * main.cpp
- *
- * Created on: Nov 27, 2012
- * Author: root
- */
- #include "subject.h"
- #include "observer.h"
- #include <iostream>
- using namespace std;
- int main(int argc,char *argv[]){
- concretesubject *sub= new concretesubject();
- observer *ruoxi= new observer_ruoxi(sub);
- observer *lidequan= new observer_lidequan(sub);
- sub->set_state("喝茶");
- sub->notify();
- sub->set_state("用膳");
- sub->notify();
- return 0;
- }
![](/blog/image/attachicons/zip.gif)