来自《大话设计模式》
观察者模式定义了一种一对多的依赖关系。让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,
会通知所有观察者对象,使他们能够自动更新自己。这里C++实现,得注意类之间的相互引用。。。。
//subjet.h
#ifndef _SUBJECT_H_
#define _SUBJECT_H_
#include <iostream>
#include <string>
#include <list>
#include "observer.h"
using namespace std;
class observer;
class subject
{
public:
subject() {};
virtual ~subject() {}
void attach(observer *ob);
void detach(observer *ob);
const string &getSubState();
void setSubState(const string &str);
virtual void notify() = 0;
protected:
list<observer *> observers;
string subState;
};
class secretary:public subject
{
public:
void notify();
};
class boss:public subject
{
public:
void notify();
};
#endif
//subject.cpp
#include "subject.h"
/*
subject::~subject()
{
for(list<observer *>::iterator iter = observers.begin(); iter != observers.end(); iter++)
{
if(*iter != NULL)
{
delete *iter;
*iter = NULL;
}
}
}
*/
void subject::attach(observer *ob)
{
if(ob != NULL)
observers.push_back(ob);
}
void subject::detach(observer *ob)
{
if(ob != NULL)
{
for(list<observer *>::iterator iter = observers.begin(); iter != observers.end(); iter++)
{
if(*iter == ob)
{
iter = observers.erase(iter);
iter--;
}
}
}
}
const string &subject::getSubState()
{
return this->subState;
}
void subject::setSubState(const string &str)
{
this->subState = str;
}
void secretary::notify()
{
cout << "secretary!" << endl;
for(list<observer *>::iterator iter = observers.begin(); iter != observers.end(); iter++)
{
if(*iter != NULL)
{
(*iter)->update();
}
}
}
void boss::notify()
{
cout << "boss!" << endl;
for(list<observer *>::iterator iter = observers.begin(); iter != observers.end(); iter++)
{
if(*iter != NULL)
{
(*iter)->update();
}
}
}
//observer.h
#ifndef _OBSERVER_H_
#define _OBSERVER_H_
#include <iostream>
#include <string>
#include <list>
#include "subject.h"
using namespace std;
class subject;
class observer
{
public:
observer(string na, subject *su):name(na), sub(su) {}
virtual ~observer() {}
virtual void update() = 0;
protected:
string name;
subject *sub;
};
class socketObserver:public observer
{
public:
socketObserver(string na, subject *su):observer(na, su) {}
void update();
};
class NBAObserver:public observer
{
public:
NBAObserver(string na, subject *su):observer(na, su) {}
void update();
};
#endif
//observer.cpp
#include "observer.h"
void socketObserver::update()
{
cout << sub->getSubState() << " " << name << "关闭股票行情, 继续工作!" << endl;
};
void NBAObserver::update()
{
cout << sub->getSubState() << " " << name << "关闭NBA直播, 继续工作!" << endl;
};
//main.cpp
#include <iostream>
#include <string>
#include "observer.h"
using namespace std;
int main()
{
subject *laoban = new boss();
socketObserver *so1 = new socketObserver("xiaoliu", laoban);
NBAObserver *nb1 = new NBAObserver("xiaodeng", laoban);
socketObserver *so2 = new socketObserver("xiaoming", laoban);
NBAObserver *nb2 = new NBAObserver("xiaohong", laoban);
laoban->setSubState(string("huhansan"));
laoban->attach(so1);
laoban->attach(so2);
laoban->attach(nb1);
laoban->attach(nb2);
laoban->notify();
laoban->detach(so2);
laoban->notify();
delete so1;
so1 = NULL;
delete so2;
so2 = NULL;
delete nb1;
nb1 = NULL;
delete nb2;
nb2 = NULL;
delete laoban;
laoban = NULL;
return 0;
}