程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 觀察者模式.cpp : 定義控制台應用程序的入口點

觀察者模式.cpp : 定義控制台應用程序的入口點

編輯:C++入門知識

觀察者模式.cpp : 定義控制台應用程序的入口點


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


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved