小菜对大鸟说:“今天白天真的笑死人了,我们一同时在上班期间看股票行情,被老板当场看到,老板很生气,后果很严重呀。”
“最近股市这么火,也应该可以理解的,你们老板说不定也炒股票。”
“其实最近项目计划排的紧,是比较忙的。而最近的故事又特别火,所以很多人都在偷偷地通过网页看行情。老板市场会出门办事,于是打劫就可以轻松一些,看看行情,几个人聊聊买卖股票的心得什么的,但是一不小心,老板就会回来,让老板看到工作当中做这些总是不太好,你猜他们想到怎么办?”
“只能小心点,那能怎么办?”
“我们公司前台秘书是一个小美眉,她的名字叫童子喆,因为平时同事们买个饮料或零食什么的,都拿一份孝敬于她,所以关系比较好,现在他们就请小子喆帮忙,如果老板出门后回来,就一定要打个电话进来,大家也好马上各就各位,这样就不会被老板发现问题了。”
“你说的这件事的情形,是一个典型的观察者模式。”大鸟说,“你不妨把期间发生的事写成程序看看。”
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
#include <stdio.h>
#include <list>
using namespace std;
class Observer;
// 通知者接口
class Subject
{
public:
virtual void Attach(Observer* observer)=0;
virtual void Detach(Observer* observer)=0;
virtual void Notify()=0;
virtual char*& SubjectState()=0;
};
// 抽象观察者
class Observer
{
public:
Observer(char* _name,Subject* _sub) : name(_name),sub(_sub){}
virtual void Update()=0;
protected:
char* name;
Subject* sub;
};
class Boss : public Subject
{
public:
// 增加
virtual void Attach(Observer* observer)
{
observers.push_back(observer);
}
// 减少
virtual void Detach(Observer* observer)
{
observers.remove(observer);
}
// 通知
virtual void Notify()
{
list<Observer*>::iterator iter;
for(iter=observers.begin();iter!=observers.end();iter++) (*iter)->Update();
}
// 老板状态
virtual char*& SubjectState()
{
return action;
}
protected:
list<Observer*> observers;
char* action;
};
class Secretary : public Subject
{
public:
// 增加
virtual void Attach(Observer* observer)
{
observers.push_back(observer);
}
// 减少
virtual void Detach(Observer* observer)
{
observers.remove(observer);
}
// 通知
virtual void Notify()
{
list<Observer*>::iterator iter;
for(iter=observers.begin();iter!=observers.end();iter++) (*iter)->Update();
}
// 前台秘书状态
virtual char*& SubjectState()
{
return action;
}
protected:
list<Observer*> observers;
char* action;
};
// 看股票的同事
class StockObserver : public Observer
{
public:
StockObserver(char* name,Subject* sub) : Observer(name,sub){}
virtual void Update()
{
printf("%s %s 关闭股票行情,继续工作!",sub->SubjectState(),name);
}
};
// 看NBA的同事
class NBAObserver : public Observer
{
public:
NBAObserver(char* name,Subject* sub) : Observer(name,sub){}
virtual void Update()
{
printf("%s %s 关闭NBA直播,继续工作!",sub->SubjectState(),name);
}
};
int main()
{
Boss* huhansan = new Boss();
// 看股票的同事
StockObserver* tongshi1 = new StockObserver("魏关姹",huhansan);
// 看NBA的同事
NBAObserver* tongshi2 = new NBAObserver("易管查",huhansan);
huhansan->Attach(tongshi1);
huhansan->Attach(tongshi2);
huhansan->Detach(tongshi1);
// 老板回来
huhansan->SubjectState() = "我胡汉三回来了!";
huhansan->Notify();
delete huhansan;
delete tongshi1;
delete tongshi2;
return 0;
}
由于魏关姹没有被老板通知到,应此被老板逮了个正着,那是相当的杯具啊!