标签:设计模式
1,所谓观察者模式就是跟站岗一样,只要收到通知国有,相应的通知而已
2.应用有,windows ,QT等一些消息通知机制,其实消息通知机制也就是观察者模式
3,样例背景,某公司,有个老板A,然后公司的员工上班,有的看NBA ,有的炒股,有一天老板A 突然了,然后秘书就给那些看NBA ,股票的员工们,发了一短信老板A来了,然后他们自己进行处理
4,代码:
// 观察者模式.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <string> #include <list> 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<Observer *> 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<Observer*>::iterator itr = observers.begin(); while (itr != observers.end()) { if ((*itr) == observer ) { observers.erase(itr); } itr++; } } void notify(){ list<Observer*>::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; }
标签:设计模式
原文地址:http://blog.csdn.net/sun734274006/article/details/42062687