设计模式学习笔记(C++实现)(十四)--职责链模式

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.《设计模式:可复用面向对象软件的基础》

猜你喜欢

转载自blog.csdn.net/u014337397/article/details/80466692