📄 demo4.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 + -