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