观察者模式.cpp : 定义控制台应用程序的入口点

2015-01-24 05:39:19 · 作者: · 浏览: 9

1,所谓观察者模式就是跟站岗一样,只要收到通知国有,相应的通知而已

2.应用有,windows ,QT等一些消息通知机制,其实消息通知机制也就是观察者模式

3,样例背景,某公司,有个老板A,然后公司的员工上班,有的看NBA ,有的炒股,有一天老板A 突然了,然后秘书就给那些看NBA ,股票的员工们,发了一短信老板A来了,然后他们自己进行处理

4,代码:

?

// 观察者模式.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include 
  
   
#include 
   
     #include 
    
      using namespace std; //监视,观察,都有一个基类,派生,实现不同的效果 class Subject; //观察器,需要接受欧消息,并且处理消息 class Observer{ protected: string name; //指定名字 Subject *sub; //设置谁来通知我 public: Observer(string name, Subject *sub) :name(name), sub(sub){} virtual void update() = 0; //当收到消息过后,我自己决定进行处理 }; //监事类,管理所有的观察者,增加,删除,发出消息,让观察者处理 class Subject{ protected: list
     
       observers; public: string action; virtual void attach(Observer*) = 0; virtual void detach(Observer*) = 0; virtual void notify() = 0; //通知观察者 }; class StackObserver :public Observer{ public: StackObserver(string name, Subject *sub) :Observer(name, sub){} void update(); }; void StackObserver::update(){ cout << name << "收到信息" << sub->action << endl; if (sub->action == "A") { cout << "leader coming in, i will close stack" << endl; } } class NBAObserver :public Observer{ public: NBAObserver(string name, Subject *sub) :Observer(name, sub){} void update(); }; void NBAObserver::update(){ cout << name << "收到信息" << sub->action << endl; if (sub->action == "A") { cout << "leader coming in, i will close NBA" << endl; } } class Secretary :public Subject{ public: void attach(Observer *observer){ observers.push_back(observer); } void detach(Observer *observer){ list
      
       ::iterator itr = observers.begin(); while (itr != observers.end()) { if ((*itr) == observer ) { observers.erase(itr); } itr++; } } void notify(){ list
       
        ::iterator iter = observers.begin(); while (iter != observers.end() ) { (*iter)->update(); iter++; } } }; int _tmain(int argc, _TCHAR* argv[]) { Subject *dwq = new Secretary(); Observer *nba = new NBAObserver("NBAER", dwq); Observer *stack = new NBAObserver("STACKER", dwq); dwq->attach(nba); dwq->attach(stack); dwq->action = "hava lanch"; dwq->notify(); cout << endl; dwq->action = "A"; dwq->notify(); cin.get(); return 0; } 
       
      
     
    
   
  


?