#include "stdafx.h" #include <iostream> #include <Windows.h> #include <boost/shared_ptr.hpp> using namespace std; using namespace boost; /** * @brief Chain Of Responsibility 职责链模式,属于GOF 23种设置模式中的行为模式的一种 * 意图: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系 将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止 */ typedef int Topic; const Topic NO_HELP_TOPIC = -1; const Topic TOPIC_APPLICATION = 1; const Topic TOPIC_DIALOG = 2; const Topic TOPIC_BUTTON = 3; /** @brief 帮助请求 */ class HelpHandle { public: HelpHandle(HelpHandle* pHelpHandle,Topic topic = NO_HELP_TOPIC) : m_pHelpHandle(pHelpHandle),m_Topic(topic) {} virtual void Help() { if(m_pHelpHandle != NULL) m_pHelpHandle->Help(); } virtual BOOL HasHelp() { return m_Topic != NO_HELP_TOPIC; } virtual void SetHandle(HelpHandle* pHelpHandle,Topic topic) { m_pHelpHandle = pHelpHandle; m_Topic = topic; } private: HelpHandle* m_pHelpHandle; Topic m_Topic; }; /** @brief 应用程序帮助 */ class HelpHandle_Application : public HelpHandle { public: HelpHandle_Application(Topic topic = NO_HELP_TOPIC) : HelpHandle(NULL,topic) {} virtual void Help() { if(HasHelp()) cout << "Application HelpHandle" << endl; else HelpHandle::Help(); } }; /** @brief 对话框帮助 */ class HelpHandle_Dialog : public HelpHandle { public: HelpHandle_Dialog(HelpHandle* pHelpHandle,Topic topic = NO_HELP_TOPIC) : HelpHandle(pHelpHandle,topic) {} virtual void Help() { if(HasHelp()) cout << "Dialog HelpHandle" << endl; else HelpHandle::Help(); } }; /** @brief 按扭帮助 */ class HelpHandle_Button : public HelpHandle { public: HelpHandle_Button(HelpHandle* pHelpHandle,Topic topic = NO_HELP_TOPIC) : HelpHandle(pHelpHandle,topic) {} virtual void Help() { if(HasHelp()) cout << "Button HelpHandle" << endl; else HelpHandle::Help(); } }; int _tmain(int argc, _TCHAR* argv[]) { shared_ptr<HelpHandle_Application> pApplicationHelp(new HelpHandle_Application(TOPIC_APPLICATION)); shared_ptr<HelpHandle_Dialog> pDialogHelp(new HelpHandle_Dialog(pApplicationHelp.get(),TOPIC_DIALOG)); shared_ptr<HelpHandle_Button> pButtonHelp1(new HelpHandle_Button(pDialogHelp.get(),TOPIC_DIALOG)); shared_ptr<HelpHandle_Button> pButtonHelp2(new HelpHandle_Button(pDialogHelp.get(),NO_HELP_TOPIC)); pButtonHelp1->Help(); pButtonHelp2->Help(); /** * 输出结果为 * Button HelpHandle * Dialog HelpHandle */ system("pause"); return 0; }