//10.观察者模式
//ver1
class StockObserver; //与 Secretary 相互依赖; 所以提前声明
class Secretary;
//股票同事类
class StockObserver
{
private:
string _name;
Secretary * _ps;
public:
StockObserver(string name, Secretary *p)
{
_name = name;
_ps = p;
}
void Update()
{
//得到前台通知,赶快采取行动。
//_ps->GetSecretaryAction();
//这里必须屏蔽; 这里没法编译通过, StockObserver 与 Secretary 相互耦合。
//解决的办法是,分别写在2个.h和.cpp文件中。并在.h文件里提前声明要引用的类,并把对象定义为指针。
}
};
//前台秘书类
class Secretary
{
private:
list<StockObserver *> myList;
string _action;
public:
//增加
void Attach(StockObserver * psob)
{
myList.push_back(psob);
}
//减少
void Detach(StockObserver * psob)
{
myList.remove(psob);
}
//通知
void Notify()
{
list<StockObserver *>::iterator it = myList.begin();
for ( ; it != myList.end(); ++it )
{
(*it)->Update();
}
}
//前台状态
void SetSecretaryAction(string strAct)
{
_action = strAct;
}
string GetSecretaryAction()
{
return _action;
}
};
void main1()
{
Secretary *ps1 = new Secretary();
StockObserver *pso1 = new StockObserver("fun", ps1);
StockObserver *pso2 = new StockObserver("test", ps1);
//前台记下两位同事
ps1->Attach((pso1));
ps1->Attach((pso2));
//老板回来了,发通知
ps1->SetSecretaryAction("老板回来了");
ps1->Notify();
}
//10.观察者模式
//ver2
//Observer.h
//前置声明
class Subject;
class Boss;
class Secretary;
class Observer
{
protected:
string _name;
Subject * _ps;
public:
Observer(string name, Subject * ps);
virtual ~Observer(void);
public:
virtual void Update();
};
//看股票同事
class StockObserver : public Observer
{
public:
StockObserver(string name, Subject * ps);
virtual ~StockObserver();
virtual void Update();
};
//看NBA同事
class NBAObserver : public Observer
{
public:
NBAObserver(string name, Subject * ps);
virtual ~NBAObserver();
virtual void Update();
};
//Observer.cpp
#include "Observer.h"
#include "Secretary.h"
Observer::Observer(string name, Subject * ps)
{
_ps = ps;
_name = name;
}
Observer::~Observer(void)
{
}
void Observer::Update()
{
_ps->GetSecretaryAction();
}
StockObserver::StockObserver(string name, Subject * ps)
: Observer(name, ps)
{}
StockObserver::~StockObserver()
{}
void StockObserver::Update()
{
_ps->GetSecretaryAction();
}
///////////////////////////////
NBAObserver::NBAObserver(string name, Subject * ps)
: Observer(name, ps)
{}
NBAObserver::~NBAObserver()
{}
void NBAObserver::Update()
{
_ps->GetSecretaryAction();
}
//-----------------------------------
//Subject.h
//前置声明
class Observer;
class StockObserver;
class NBAObserver;
//通知者接口
class Subject
{
public:
virtual void Attach(Observer *pob);
virtual void Detach(Observer *pob);
virtual void Notify();
void SetSecretaryAction(string strAct);
string GetSecretaryAction();
};
//老板通知者
class Boss : public Subject
{
private:
list<Observer*> myList;
string _action;
public:
void Attach(Observer *pob);
void Detach(Observer *pob);
void Notify();
void SetSecretaryAction(string strAct);
string GetSecretaryAction();
};
class Secretary
{
private:
list<Observer*> myList;
string _action;
public:
//增加
void Attach(Observer * pob);
//减少
void Detach(Observer * pob);
//通知
void Notify();
//前台状态
void SetSecretaryAction(string strAct);
string GetSecretaryAction();
};
//Subject.cpp
#include "Secretary.h"
#include "Observer.h"
void Subject::Attach(Observer *pob){}
void Subject::Detach(Observer *pob){}
void Subject::Notify(){}
void Subject::SetSecretaryAction(string strAct){}
string Subject::GetSecretaryAction(){return "";}
////////////////
void Boss::Attach(Observer *pob)
{
myList.push_back(pob);
}
void Boss::Detach(Observer *pob)
{
myList.remove(pob);
}
void Boss::Notify()
{
list<Observer *>::iterator it = myList.begin();
for ( ; it != myList.end(); ++it )
{
(*it)->Update();
}
}
void Boss::SetSecretaryAction(string strAct)
{
_action = strAct;
}
string Boss::GetSecretaryAction()
{
return _action;
}
///////////////
void Secretary::Attach(Observer * pob)
{
myList.push_back(pob);
}
//减少
void Secretary::Detach(Observer * pob)
{
myList.remove(pob);
}
//通知
void Secretary::Notify()
{
list<Observer *>::iterator it = myList.begin();
for ( ; it != myList.end(); ++it )
{
(*it)->Update();
}
}
//前台状态
void Secretary::SetSecretaryAction(string strAct)
{
_action = strAct;
}
string Secretary::GetSecretaryAction()
{
return _action;
}
//-----------------
//main.cpp
#include "Secretary.h"
#include "Observer.h"
int main()
{
//老板
Boss *pBoss = new Boss();
//看股票同事
StockObserver *pTongshi1 = new StockObserver("fun", pBoss);
//看NBA同事
NBAObserver *pTongshi2 = new NBAObserver("Test", pBoss);
pBoss->Attach(pTongshi1);
pBoss->Attach(pTongshi2);
pBoss->Detach(pTongshi1);
//老板回来
pBoss->SetSecretaryAction("我是老板我回来了!");
//发出通知
pBoss->Notify();
return 0;
}