设计模式学习-Chain Of Responsiblity(责任链)
来源:互联网 发布:mac 8080端口被占用 编辑:程序博客网 时间:2024/06/17 01:21
意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递请求,直到一个对象处理它为止.
适用性:
有多个对象可以处理一个请求,那个对象处理该请求运行时自动确定
你想在不明确制定接受者的情况下,向多个对象中的一个提交一个请求
可处理一个请求的对象集合应被动态指定
示例图:
示例代码:
class CHandler
{
public:
CHandler(CHandler* nextHandler);
public:
~CHandler(void);
public:
void HandleRequest(CRequest req)
{
if(IsMatch(req.GetRequestType()))
{
_HandleRequest(req);
}
else
{
if(m_NextHandler)
{
m_NextHandler->HandleRequest(req);
}
else
{
_tprintf(_T("unhandler message/n"));
}
}
}
protected:
virtual void _HandleRequest(CRequest req) =0;
virtual bool IsMatch(CRequest::RequestType reqType)=0;
private:
CHandler* m_NextHandler;
};
//消息处理类处理消息
class CMessageHandler:public CHandler
{
public:
CMessageHandler(CHandler* pNextHandler)
:CHandler(pNextHandler)
{
}
public:
~CMessageHandler()
{
}
public:
virtual bool IsMatch(CRequest::RequestType reqType)
{
if(reqType == CRequest::eMessage)
{
return true;
}
return false;
}
virtual void _HandleRequest(CRequest req)
{
_tprintf(_T("Message handled/n"));
}
};
//键盘处理类处理键盘消息
class CKeyHandler:public CMessageHandler
{
public:
CKeyHandler(CHandler* pNextHandler)
:CMessageHandler(pNextHandler)
{
}
public:
~CKeyHandler()
{
}
public:
virtual bool IsMatch(CRequest::RequestType reqType)
{
if(reqType == CRequest::eKey)
{
return true;
}
return false;
}
virtual void _HandleRequest(CRequest req)
{
_tprintf(_T("Key Message handled/n"));
}
};
//处理请求
class CRequest
{
public:
enum RequestType
{
eMessage,
eKey,
eMouse,
};
public:
CRequest(CRequest::RequestType reqType);
public:
~CRequest(void);
public:
CRequest::RequestType GetRequestType()
{
return m_ReqType;
}
private:
CRequest::RequestType m_ReqType;
};
//调用
CKeyHandler keyHandler(NULL);
CMessageHandler messageHandler(&keyHandler);
CRequest keyReq(CRequest::eKey);
CRequest msgReq(CRequest::eMessage);
CRequest mouseReq(CRequest::eMouse);
messageHandler.HandleRequest(keyReq);
messageHandler.HandleRequest(msgReq);
messageHandler.HandleRequest(mouseReq);
结果
- 设计模式学习-Chain Of Responsiblity(责任链)
- java设计模式-责任链模式(Chain Of Resposibility)
- 浅谈设计模式:责任链模式(Chain Of Responsibility)
- Java设计模式----责任链模式(Chain of Responsibility)
- 设计模式之责任链模式(Chain of Responsibity)
- 设计模式:责任链模式(Chain of Responsibility)
- 设计模式之---责任链模式(Chain of Responsibility)
- 设计模式:责任链模式(Chain of Responsibility)
- 设计模式:责任链模式(Chain of Responsibility)
- 设计模式(17)-责任链模式(Chain of Responsibility)
- 设计模式_责任链模式(Chain Of Responsibility)
- [设计模式]责任链模式(Chain of Responsibility)
- 设计模式之责任链模式(Chain of Responsibility)
- 【设计模式】责任链模式(Chain of Responsibility Pattern)
- 设计模式学习与实践(二十三)----责任链模式(chain of resposibility)
- 设计模式C++学习笔记之十七(Chain of Responsibility责任链模式)
- 设计模式C++学习笔记之十七(Chain of Responsibility责任链模式)
- 设计模式C++学习笔记之十七(Chain of Responsibility责任链模式)
- win server 2008 安装oracle 的体会
- OCAF初步
- China and U.S. grapple with military mistrust
- The reference to entity "characterEncoding" must end with the ';' delimiter
- Could not read mappings from resource: hiber.hbm.xml
- 设计模式学习-Chain Of Responsiblity(责任链)
- 深入解析C语言声明
- emulator: ERROR: no search paths found in this AVD's configuration
- 在桌面應用程式中使用 WebKit (1) -雜論,以及用 Objective C 操作 DOM
- 求助啊
- 关于匹配
- jasperreports报表生成代码
- c++远程调用webservice
- SQL语句大全