观察者模式

观察者模式
 

观察者模式

前序

小菜对大鸟说:“今天白天真的笑死人了,我们一同时在上班期间看股票行情,被老板当场看到,老板很生气,后果很严重呀。”

“最近股市这么火,也应该可以理解的,你们老板说不定也炒股票。”

“其实最近项目计划排的紧,是比较忙的。而最近的故事又特别火,所以很多人都在偷偷地通过网页看行情。老板市场会出门办事,于是打劫就可以轻松一些,看看行情,几个人聊聊买卖股票的心得什么的,但是一不小心,老板就会回来,让老板看到工作当中做这些总是不太好,你猜他们想到怎么办?”

“只能小心点,那能怎么办?”

“我们公司前台秘书是一个小美眉,她的名字叫童子喆,因为平时同事们买个饮料或零食什么的,都拿一份孝敬于她,所以关系比较好,现在他们就请小子喆帮忙,如果老板出门后回来,就一定要打个电话进来,大家也好马上各就各位,这样就不会被老板发现问题了。”

“你说的这件事的情形,是一个典型的观察者模式。”大鸟说,“你不妨把期间发生的事写成程序看看。”

观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

实现方式(UML类图)


实现代码

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

}

运行结果


由于魏关姹没有被老板通知到,应此被老板逮了个正着,那是相当的杯具啊!

所有文件打包下载

你可能感兴趣的:(观察者模式)