职责链模式(Chain Of Responsibility)

设计模式系列

Chain Of Responsibility职责链模式——对象行为模式

1.意图

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

 

2.适用性

  • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
  • 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  • 可处理一个请求的对象集合应被动态指定

 

3.结构

 

4.参与者

  • Handler

—— 定义一个处理请求的接口

—— (可选)实现后继链

  • ConcreteHandler

—— 处理它所负责的请求

—— 可访问它的后继者

—— 如果可处理该请求,就处理之;否则将该请求转发给它的后继者

  • Client

—— 向链上的具体处理者(ConcreteHandler)对象提交请求

 

5.效果

Responsibility链有下列有点和缺点(liabilities);

1)降低耦合度

2)增强了给对象指派职责的灵活性

3)不保证被接受

 

6.案例

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

template <class T>
string MyConvertToString(T value)
{
    stringstream ss;
    ss << value;
    return ss.str();
}

//顶层的抽象类,规范了击鼓传花的组合能力
class Handle
{
public:
    void setSuccessor(Handle* pSuccessor)
    {
        this->m_pHandle = pSuccessor;
    }
    virtual string handleFeeRequest(double fee) = 0;
protected:
    Handle* m_pHandle;
};

class PrjManager :public Handle
{
public:
    string handleFeeRequest(double fee)
    {
        string strTemp = "";
        if (fee < 500)
        {
            strTemp = "项目经理同意" + MyConvertToString(fee) + "费用";
            return strTemp;
        }
        else
        {
            if (this->m_pHandle != nullptr)
            {
                return m_pHandle->handleFeeRequest(fee);
            }
        }
        return strTemp;
    }
};

class DepManager :public Handle
{
public:
    string handleFeeRequest(double fee)
    {
        string strTemp = "";
        if (fee >= 500 && fee < 1000)
        {
            strTemp = "部门经理同意" + MyConvertToString(fee) + "费用";
            return strTemp;
        }
        else
        {
            if (this->m_pHandle != nullptr)
            {
                return m_pHandle->handleFeeRequest(fee);
            }
        }
        return strTemp;
    }
};

class CEOManager :public Handle
{
public:
    string handleFeeRequest(double fee)
    {
        string strTemp = "";
        if (fee >= 1000)
        {
            strTemp = "CEO经理同意" + MyConvertToString(fee) + "费用";
            return strTemp;
        }
        else
        {
            if (this->m_pHandle != nullptr)
            {
                return m_pHandle->handleFeeRequest(fee);
            }
        }
        return strTemp;
    }
};
int main(void) {
    //先要组装我们的责任链
    Handle* pH1 = new PrjManager;
    Handle* pH2 = new DepManager;
    Handle* pH3 = new CEOManager;
    pH1->setSuccessor(pH2);
    pH2->setSuccessor(pH3);
    cout << pH1->handleFeeRequest(128) << endl;
    cout << pH1->handleFeeRequest(512) << endl;
    cout << pH1->handleFeeRequest(1024) << endl;
    system("pause");
    return 0;
}

 

 

设计模式系列 https://blog.csdn.net/nie2314550441/article/details/105849726

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值