随笔-91  评论-137  文章-0  trackbacks-0
 

观察者模式

前序

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

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

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

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

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

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

观察者模式

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

实现方式(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;

}

运行结果


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

所有文件打包下载

posted on 2011-06-16 16:19 lwch 阅读(4268) 评论(8)  编辑 收藏 引用 所属分类: 设计模式

评论:
# re: 观察者模式 2011-06-16 21:41 | Skill
哥们 你学东西还挺会活学活用的 不错  回复  更多评论
  
# re: 观察者模式 2011-06-17 09:29 | 战魂小筑
你这个UML图是用什么软件画的啊  回复  更多评论
  
# re: 观察者模式 2011-06-17 09:53 | lwch
@战魂小筑
VS2010  回复  更多评论
  
# re: 观察者模式 2011-06-20 12:18 | 杨粼波
我还是觉得用报刊订阅讲述比较贴切。哈哈哈,这是经典的描述。

不过,楼主的讲述也很生动。哈哈哈,别有风味。  回复  更多评论
  
# re: 观察者模式 2011-06-20 13:22 | lwch
@杨粼波
基本上都是从大话设计模式里抄下来的.  回复  更多评论
  
# re: 观察者模式[未登录] 2011-06-20 14:25 | 杨粼波
==!那个,大话我也有买,不过束之高阁,还没看过……
我把几乎市面上所有的设计模式的书都买了。哈哈,收藏。  回复  更多评论
  
# re: 观察者模式 2011-06-22 22:04 | garysoft
不错不错,学习下  回复  更多评论
  
# re: 观察者模式 2012-04-05 22:45 | SkyLeung
不錯,講的很清晰。
但是有個問題是:老闆會主動通知員工他回來了嗎?
按照開篇的故事情節,應該是有前臺小妹通知已經register的同事比較好!  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理