迭代子模式(Chain of Responsibility Pattern)

定义

责任链模式主要用于处理请求,将处理请求的对象连成链,每个请求处理者都有着自己的处理权限. 
意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求直到有一个对象处理它为止。

                           C++设计模式--责任链模式

  • Handler:定义一个处理请求的接口。一般还带一个设置下一个处理者的接口。
  • ConcreteHandler:具体请求处理者,处理他负责处理的请求,或者将请求交给它的继承者。

 

常用场景

不同的请求需要不同权限的对象来处理的情况

 

优缺点

优点:

  • 降低耦合度,将请求的发送者和接收者解耦。 
  • 简化了对象,使得对象不需要知道链的结构。 
  • 增加新的具体处理者很方便,无须修改原有代码,只需要在客户端重新建链即可。

缺点:

  • 性能问题,每个请求都从头到尾遍历。 
  • 如果建链不当,可能会造成循环调用,这将导致系统陷入死循环

C++实现

举例:公司员工的请假流程

作为一个员工,在需要请假时需要发起流程,一般请假按请的时间长短需要跟不同级别的管理者请,就是请假这个请求根据时间长短可由不同的处理者处理,非常适合责任链模式

类图:
                      C++设计模式--责任链模式

代码:

#include <iostream>

// 抽象处理基类
class Handle
{
public:
    Handle() : m_pNextHandle(nullptr) {}
    virtual ~Handle() {}

    virtual void HandleRequest(unsigned short days) = 0;
    void SetNextHandle(Handle* handle) { m_pNextHandle = handle;}
    Handle* NextHandle() {return m_pNextHandle;}

private:
    Handle* m_pNextHandle; // 下一个处理者

};

// 直接主管
class SuperIntendent : public Handle
{
public:
    SuperIntendent() {}
    ~SuperIntendent() {}

    void HandleRequest(unsigned short days)
    {
        std::cout << "请假 " << days << " 天 --->  ";
        if (days <= 1)
        {
            std::cout << "主管: 同意了!" << std::endl;
        }
        else
        {
            std::cout << "主管: 向上申请! --->  ";
            if (NextHandle())
                NextHandle()->HandleRequest(days);
        }
    }
};

// 部门经理
class Manager : public Handle
{
public:
    Manager() {}
    ~Manager() {}

    void HandleRequest(unsigned short days)
    {
        if (days <= 3)
        {
            std::cout << "经理: 同意了!" << std::endl;
        }
        else
        {
            std::cout << "经理: 向上申请! --->  ";
            if (NextHandle())
                NextHandle()->HandleRequest(days);
        }
    }
};

// 老板
class Boss : public Handle
{
public:
    Boss() {}
    ~Boss() {}

    void HandleRequest(unsigned short days)
    {
        std::cout << "老板: 同意了!" << std::endl;
    }
};

void ChainOfResponsibilityTest()
{
    Handle* pSuperIntendent = new SuperIntendent;
    Handle* pManager = new Manager;
    Handle* pBoss = new Boss;

    pSuperIntendent->SetNextHandle(pManager);
    pManager->SetNextHandle(pBoss);

    pSuperIntendent->HandleRequest(1);
    pSuperIntendent->HandleRequest(3);
    pSuperIntendent->HandleRequest(5);

    delete pBoss;
    delete pManager;
    delete pSuperIntendent;

    pSuperIntendent = nullptr;
    pManager = nullptr;
    pBoss = nullptr;
}

 

C++设计模式--责任链模式

相关文章:

  • 2021-09-17
  • 2021-12-05
  • 2021-03-31
  • 2021-10-25
  • 2021-12-15
猜你喜欢
  • 2021-09-09
  • 2021-07-26
  • 2022-12-23
  • 2021-12-21
  • 2022-01-08
相关资源
相似解决方案