职责链模式,用我的理解就是动作的处理链表。根据请求的不同类型,在链表查找相应类型的处理者。处理者是一个链表。
用下面的一个图来解释
基本的UML图为
- // ChainofResponsibility.cpp : 定义控制台应用程序的入口点。
- //************************************************************************/
- /* @filename ChainofResponsibility.cpp
- @author wallwind
- @createtime 2012/11/6 11:58
- @function 责任链模式
- @email wochenglin@qq.com
- @weibo @成林有理想
- */
- /************************************************************************/
-
- #include "stdafx.h"
- #include <iostream>
-
- using namespace std;
-
- class IChain
- {
- public:
- IChain():m_nextChain(NULL)
- {
-
- }
- virtual ~IChain()
- {
- if (m_nextChain !=NULL)
- {
- delete m_nextChain;
- m_nextChain = NULL;
- }
- }
-
- void setChainHandler(IChain* handler)
- {
- m_nextChain = handler;
- }
- virtual void handleReq(int reqtype) = 0;
-
-
- protected:
- IChain* m_nextChain;
-
- };
-
- class FirstHandler:public IChain
- {
- public:
- FirstHandler():IChain()
- {
- }
- virtual ~FirstHandler(){}
-
- virtual void handleReq(int reqtype)
- {
- if (reqtype <3)
- {
- cout<<"FirstHandler::handleReq"<<endl;
- }
- else if (m_nextChain !=NULL)
- {
- m_nextChain->handleReq(reqtype);
- }
- else
- {
- cout<<"no handler"<<endl;
- }
- }
- };
-
- class SecondHandler:public IChain
- {
- public:
- SecondHandler():IChain()
- {
-
- }
- virtual ~SecondHandler(){}
-
- virtual void handleReq(int reqtype)
- {
- if (reqtype <7)
- {
- cout<<"SecondHandler::handleReq"<<endl;
- }
- else if (m_nextChain !=NULL)
- {
- m_nextChain->handleReq(reqtype);
- }
- else
- {
- cout<<"no handler"<<endl;
- }
- }
-
-
-
- };
-
- class ThirdHandler:public IChain
- {
- public:
- ThirdHandler():IChain()
- {
- }
- virtual ~ThirdHandler(){}
-
- virtual void handleReq(int reqtype)
- {
- if (reqtype <9)
- {
- cout<<"ThirdHandler::handleReq"<<endl;
- }
- else if (m_nextChain !=NULL)
- {
- m_nextChain->handleReq(reqtype);
- }
- else
- {
- cout<<"no handler"<<endl;
- }
- }
-
-
- };
-
- int _tmain(int argc, _TCHAR* argv[])
- {
-
- IChain *p1handler= new FirstHandler;
- IChain *p2handler= new SecondHandler;
- IChain *p3handler= new ThirdHandler;
-
- p1handler ->setChainHandler(p2handler);
- p2handler->setChainHandler(p3handler);
-
- p3handler ->handleReq(4);
-
- delete p1handler,p2handler,p3handler;
- return 0;
- }
- // ChainofResponsibility.cpp : 定义控制台应用程序的入口点。
- //************************************************************************/
- /* @filename ChainofResponsibility.cpp
- @author wallwind
- @createtime 2012/11/6 11:58
- @function 责任链模式
- @email wochenglin@qq.com
- @weibo @成林有理想
- */
- /************************************************************************/
- #include "stdafx.h"
- #include <iostream>
- using namespace std;
- class IChain
- {
- public:
- IChain():m_nextChain(NULL)
- {
- }
- virtual ~IChain()
- {
- if (m_nextChain !=NULL)
- {
- delete m_nextChain;
- m_nextChain = NULL;
- }
- }
- void setChainHandler(IChain* handler)
- {
- m_nextChain = handler;
- }
- virtual void handleReq(int reqtype) = 0;
- protected:
- IChain* m_nextChain;
- };
- class FirstHandler:public IChain
- {
- public:
- FirstHandler():IChain()
- {
- }
- virtual ~FirstHandler(){}
- virtual void handleReq(int reqtype)
- {
- if (reqtype <3)
- {
- cout<<"FirstHandler::handleReq"<<endl;
- }
- else if (m_nextChain !=NULL)
- {
- m_nextChain->handleReq(reqtype);
- }
- else
- {
- cout<<"no handler"<<endl;
- }
- }
- };
- class SecondHandler:public IChain
- {
- public:
- SecondHandler():IChain()
- {
- }
- virtual ~SecondHandler(){}
- virtual void handleReq(int reqtype)
- {
- if (reqtype <7)
- {
- cout<<"SecondHandler::handleReq"<<endl;
- }
- else if (m_nextChain !=NULL)
- {
- m_nextChain->handleReq(reqtype);
- }
- else
- {
- cout<<"no handler"<<endl;
- }
- }
- };
- class ThirdHandler:public IChain
- {
- public:
- ThirdHandler():IChain()
- {
- }
- virtual ~ThirdHandler(){}
- virtual void handleReq(int reqtype)
- {
- if (reqtype <9)
- {
- cout<<"ThirdHandler::handleReq"<<endl;
- }
- else if (m_nextChain !=NULL)
- {
- m_nextChain->handleReq(reqtype);
- }
- else
- {
- cout<<"no handler"<<endl;
- }
- }
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- IChain *p1handler= new FirstHandler;
- IChain *p2handler= new SecondHandler;
- IChain *p3handler= new ThirdHandler;
- p1handler ->setChainHandler(p2handler);
- p2handler->setChainHandler(p3handler);
- p3handler ->handleReq(4);
- delete p1handler,p2handler,p3handler;
- return 0;
- }