标签:设计模式
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