⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demo4.cpp

📁 两个观察者模式的例子
💻 CPP
字号:
// DEMO4.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <list>
#include <algorithm>

using namespace std;

//-----------------------观察者模式部分----------------
class Subject;

class Observer
{
public:
	virtual ~Observer()
	{
	}
	virtual void Update(const char  *szMsg) = 0;
protected:
	Observer()
	{
	}
};

class Subject
{
public:
	virtual ~Subject()
	{
	}

	virtual void Attach(Observer *o)
	{
		_observers.push_back(o);
	}
	virtual void Detach(Observer *o)
	{
		list<Observer *>::iterator i = find (_observers.begin(), _observers.end(), o);
		_observers.erase(i);

	}
	virtual void Notify(const char  *szMsg)
	{
		list<Observer *>::iterator i;
		for (i = _observers.begin(); i != _observers.end(); ++i)
		{
			(*i)->Update(szMsg);
		}
	}
protected:
	Subject()
	{
	}
private:
	list<Observer *> _observers;
};

class CCU
	: public Observer
{
public:
	CCU(int id)
		:m_id(id)
	{
		
	}
	~CCU()
	{
	}

	int GetID(void)
	{
		return m_id;
	}

	virtual void Update(const char *szMsg)
	{
		printf("CU[%d]收到报警消息:%s\n", m_id, szMsg);
	}

private:
	int m_id;
};

//--------------------职责链部分---------------------------------
class CHandler
{
public:
	CHandler(CHandler *pH):successor(pH) {}
	virtual void HandleRequest(int request)= 0;
protected:
	CHandler *successor;
};

class CMsg1Handler : public CHandler
{
public:
	CMsg1Handler(CHandler *pH):CHandler(pH){}
	virtual void HandleRequest(int request)
	{
		if (1 == request)
		{
			printf("消息1转发给其它服务器\n");
		}
		else
			successor->HandleRequest(request);
	}
};

class CMsg2Handler : public CHandler, public Subject//---CMsg2Handler是职责链与观察者模式结合部分
{
public:
	CMsg2Handler(CHandler *pH):CHandler(pH){}
	virtual void HandleRequest(int request)
	{
		if (2 == request)
		{
			printf("加头{消息2}转发给CU\n");
			Notify("消息2");
		}
		else
			successor->HandleRequest(request);
	}
};

class CMsg3Handler : public CHandler
{
public:
	CMsg3Handler(CHandler *pH):CHandler(pH){}
	virtual void HandleRequest(int request)
	{
		if (3 == request)
		{
			printf("消息3保存\n");
		}
		else
			successor->HandleRequest(request);
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	char cmd[2];
	int num, request, i;
	CCU *cu[5];
	bool bLoop = true;

	CMsg3Handler *pMsg3Handler = new CMsg3Handler(NULL);
	CMsg2Handler *pMsg2Handler = new CMsg2Handler(pMsg3Handler);
	CMsg1Handler *pMsg1Handler = new CMsg1Handler(pMsg2Handler);
	
	for (i=0;i < 5; i++)
		cu[i] = new CCU(i);

	while(bLoop)
	{
		printf("------------\n");
		scanf("%s", cmd);
		switch(cmd[0])
		{
		case 'l':
		case 'L':
			scanf("%d", &num);
			if (num >= 0 && num < 5)
				pMsg2Handler->Attach(cu[num]);
			break;
		case 'e':
		case 'E':
			scanf("%d", &num);
			if (num >= 0 && num < 5)
				pMsg2Handler->Detach(cu[num]);
			break;
		case 'R':
		case 'r':
			scanf("%d", &request);
			pMsg1Handler->HandleRequest(request);
			break;
		case 'Q':
		case 'q':
			delete pMsg1Handler;
			pMsg1Handler = NULL;
			delete pMsg2Handler;
			pMsg2Handler = NULL;
			delete pMsg3Handler;
			pMsg3Handler = NULL;
			for (i=0;i < 5; i++)
			{
				delete cu[i];
				cu[i] = NULL;
			}
			bLoop = false;
			break;
		}
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -