设计模式之“职责链模式”

介绍

  • 抽象处理者 Handler
    定义一个请求的处理方法handleMessage,唯一对外开放的方法;定义一个链的编排方法setNext,设置下一个处理者;定义了具体的请求者必须实现的两个方法:定义自己能够处理的级别getHandlerLevel和具体的处理任务echo
  • 具体处理者 ConcreteHandler
    实现抽象方法
  • 请求发出者Client
    发出请求

优点: 请求和处理分开

缺点:

  • 性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候。
  • 调试不很方便,采用了类似递归的方式,调试的时候逻辑可能比较复杂

避免出现超长链的情况, 一般的做法是在Handler中设置一个最大节点数量, 在setNext方法中判断是否已经是超过其阈值, 超过则不允许该链建立, 避免无意识地破坏系统性能。

UML类图:

代码:

#ifndef SIMPLE_CHAIN_H
#define SIMPLE_CHAIN_H

#include <iostream>
#include <typeinfo>
using namespace std;

/**
 * @brief The Handler class
 * Handler类,定义一个处理请示的接口。
 */
class Handler
{
public:
    //设置并返回继任者
    Handler * setSuccessor(Handler *successor)
    {
        m_successor = successor;
        return m_successor;
    }

    virtual void handleRequest(int request) = 0;
protected:
    Handler *m_successor;
};


/**
 * @brief The ConcreteHandler1 class
 * ConcreteHandler1,当请求数在0到10之间则有权处理,否则转到下一位。
 */
class ConcreteHandler1 : public Handler
{
public:
    void handleRequest(int request) override
    {
        if( request >=10 && request <20)
        {
            cout<<typeid(this).name()<<"处理请求 :"<<request<<endl;
        }
        else if(m_successor != nullptr )
        {
            m_successor->handleRequest(request);
        }
    }
};

/**
 * @brief The ConcreteHandler2 class
 * ConcreteHandler2,当请求数在10到20之间则有权处理,否则转到下一位。
 */
class ConcreteHandler2 : public Handler
{
public:
    void handleRequest(int request) override
    {
        if( request >=0 && request <10)
        {
            cout<<typeid(this).name()<<"处理请求 :"<<request<<endl;
        }
        else if(m_successor != nullptr )
        {
            m_successor->handleRequest(request);
        }
    }
};

/**
 * @brief The ConcreteHandler3 class
 * ConcreteHandler3,当请求数在20到30之间则有权处理,否则转到下一位。
 */
class ConcreteHandler3 : public Handler
{
public:
    void handleRequest(int request) override
    {
        if( request >=20 && request <30)
        {
            cout<<typeid(this).name()<<"处理请求 :"<<request<<endl;
        }
        else if(m_successor != nullptr )
        {
            m_successor->handleRequest(request);
        }
    }
};

#endif // SIMPLE_CHAIN_H

加薪示例代码:

UML类图:

代码:

#ifndef SALARY_INCREASE_H
#define SALARY_INCREASE_H
#include <iostream>
#include <typeinfo>
using namespace std;

class Request
{
public:
    string getRequestType() const
    {
        return m_requestType;
    }
    void setRequestType(string reqType)
    {
        m_requestType = reqType;
    }

    void setRequestContent(string reqContent)
    {
        m_requestContent = reqContent;
    }

    string getRequestContent() const
    {
        return m_requestContent;
    }

    void setNumber(int num)
    {
        m_number = num;
    }
    int getNumber() const
    {
        return m_number;
    }
private:
    //申请类别
    string m_requestType;
    //申请内容
    string m_requestContent;
    //数量
    int m_number;
};

class Manager
{
public:
    Manager(string name)
    {
        m_name = name;
    }
    //设置管理者上级
    void setSuperior(Manager *superior)
    {
        m_superior = superior;
    }

    //申请请求
    virtual void requestApplications(Request *request ) = 0;
protected:
    string m_name;
    Manager *m_superior;
};

//经理
class CommonManager : public Manager
{
public:
    CommonManager(string name)
        :Manager(name)
    {

    }

    void requestApplications(Request *request) override
    {
        if( request->getRequestType() == "请假" && request->getNumber() <= 2)
        {
            cout<<m_name<<" : "<<request->getRequestContent()<<" 数量: "<<request->getNumber()<<" 被批准"<<endl;
        }
        else
        {
            if ( m_superior != nullptr)
                m_superior->requestApplications(request);
        }
    }
};

/**
 * @brief The Majordomo class
 * 总监
 */
class Majordomo : public Manager
{
public:
    Majordomo(string name)
        :Manager(name)
    {

    }

    void requestApplications(Request *request) override
    {
        if( request->getRequestType() == "请假" && request->getNumber() <= 5)
        {
            cout<<m_name<<" : "<<request->getRequestContent()<<" 数量: "<<request->getNumber()<<" 被批准"<<endl;
        }
        else
        {
            if ( m_superior != nullptr)
                m_superior->requestApplications(request);
        }
    }
};


/**
 * @brief The GeneralManager class
 * 总经理
 */
class GeneralManager : public Manager
{
public:
    GeneralManager(string name)
        :Manager(name)
    {

    }

    void requestApplications(Request *request) override
    {
        if( request->getRequestType() == "请假" )
        {
            cout<<m_name<<" : "<<request->getRequestContent()<<" 数量: "<<request->getNumber()<<" 被批准"<<endl;
        }
        else if(request->getRequestType() == "加薪" && request->getNumber() <= 5000)
        {
            cout<<m_name<<" : "<<request->getRequestContent()<<" 数量: "<<request->getNumber()<<" 被批准"<<endl;
        }
        else if(request->getRequestType() == "加薪" && request->getNumber() > 5000)
        {
            cout<<m_name<<" : "<<request->getRequestContent()<<" 数量: "<<request->getNumber()<<" 再说吧"<<endl;
        }
        else
        {
            cout<<"没有该类处理"<<endl;
        }
    }
};




#endif // SALARY_INCREASE_H

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liu-Eleven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值