1.职责链模式简介
- 英文名称
Chain of responsibility - 主要目的
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。职责链模式将这些要处理请求的对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 - 使用场景
1.有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定;
2.你向在不明确指定接受者的情况下,向多个对象中的一个提交一个请求;
3.处理请求的对象集合应该动态指定的时候。
2.职责链模式代码示例
- 测试平台
1.开发语言:C++
2.开发工具:VS2015
3.操作系统:Win7 X64 代码说明
1.TASK_TYPE–任务类型定义,用于表示职责链中可以响应的所有任务类型;
2.Handler–抽象任务处理者类,用于定义基本接口;
3.MarketDepartment、FinanceDepartment、DevelopDepartment–具体任务处理者类,用来响应具体的任务。注意:
1.本例用职责链模式来说明公司内部各种任务的处理情况;
2.首先将能处理任务的所有部门构成一个职责链,然后将任务信息发布至职责链上,职责链上的对象根据任务类型来响应具体的热舞;
3.通过职责链模式,任务发布者只需要了解任务的任务信息,不再需要了解任务处理者的相关信息,从而降低了任务发布者与处理者之间的耦合度。具体代码
#include <iostream>
using namespace std;
//任务类型,用来表示任务的类型
enum TASK_TYPE
{
TASK_TYPE_MARKET = 0, //销售型任务
TASK_TYPE_FINANCE, //财务型任务
TASK_TYPE_DEVELOP, //研发型任务
};
//任务处理抽象类,用于定义任务处理接口
class Handler
{
public:
//函数功能:设置下一个任务处理者
//参数: Handler* pNext[IN] -- 下一个任务处理者
//返回值: 无
void SetNextHandle(Handler* pNext)
{
if (pNext != NULL)
{
this->m_pNextHandle = pNext;
}
}
//函数功能:处理任务
//参数: const TASK_TYPE taskType[IN] -- 任务类型
// const string taskInfo[IN] -- 任务内容
//返回值: 无
virtual void HandleTask(const TASK_TYPE taskType, const string taskInfo) = 0;
protected:
Handler* m_pNextHandle; //下一个任务处理者
};
//具体任务处理类,市场部
class MarketDepartment:public Handler
{
public:
//函数功能:处理任务
//参数: const TASK_TYPE taskType[IN] -- 任务类型
// const string taskInfo[IN] -- 任务内容
//返回值: 无
void HandleTask(const TASK_TYPE taskType, const string taskInfo)
{
if (TASK_TYPE_MARKET == taskType)
{
//处理市场型任务
cout << "任务内容:" << taskInfo.c_str() << ",处理部门:市场部" << endl;
}
else
{
//其他任务类型
if (this->m_pNextHandle != NULL)
{
this->m_pNextHandle->HandleTask(taskType, taskInfo);
}
}
}
};
//具体任务处理类,财务部
class FinanceDepartment :public Handler
{
public:
//函数功能:处理任务
//参数: const TASK_TYPE taskType[IN] -- 任务类型
// const string taskInfo[IN] -- 任务内容
//返回值: 无
void HandleTask(const TASK_TYPE taskType, const string taskInfo)
{
if (TASK_TYPE_DEVELOP == taskType)
{
//处理财务型任务
cout << "任务内容:" << taskInfo.c_str() << ",处理部门:研发部" << endl;
}
else
{
//其他任务类型
if (this->m_pNextHandle != NULL)
{
this->m_pNextHandle->HandleTask(taskType, taskInfo);
}
}
}
};
//具体任务处理类,研发部
class DevelopDepartment :public Handler
{
public:
//函数功能:处理任务
//参数: const TASK_TYPE taskType[IN] -- 任务类型
// const string taskInfo[IN] -- 任务内容
//返回值: 无
void HandleTask(const TASK_TYPE taskType, const string taskInfo)
{
if (TASK_TYPE_FINANCE == taskType)
{
//处理财务型任务
cout << "任务内容:" << taskInfo.c_str() << ",处理部门:财务部" << endl;
}
else
{
//其他任务类型
if (this->m_pNextHandle != NULL)
{
this->m_pNextHandle->HandleTask(taskType, taskInfo);
}
}
}
};
int main()
{
//先定义所有的任务处理对象
Handler* pMarket = new MarketDepartment();
Handler* pFinance = new FinanceDepartment();
Handler* pDevelop = new DevelopDepartment();
//将所有任务处理对象构成职责链
pMarket->SetNextHandle(pFinance);
pFinance->SetNextHandle(pDevelop);
//利用职责链响应任务
//处理研发型任务
pMarket->HandleTask(TASK_TYPE_DEVELOP, "开发软件A");
//处理市场型任务
pMarket->HandleTask(TASK_TYPE_MARKET, "洽谈合同B");
//处理财务型任务
pMarket->HandleTask(TASK_TYPE_FINANCE, "发季度奖金");
delete pMarket;
pMarket = NULL;
delete pFinance;
pFinance = NULL;
delete pDevelop;
pDevelop = NULL;
getchar();
return 0;
}
- 输出结果
栏目导航
上一篇:设计模式学习笔记(C++实现)(十三)–代理模式
下一篇:设计模式学习笔记(C++实现)(十五)–命令模式
参考文献:
1.《设计模式:可复用面向对象软件的基础》