设计模式之责任链模式(C++)

1. 作用

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

2. UML类图


这里写图片描述
参与者:

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

3. 实现

  • 举例:请假是我们日常生活中经常遇到的事,一般请假按请的时间长短需要跟不同级别的管理者请,就是请假这个请求根据时间长短可由不同的处理者处理,非常适合责任链模式。
    这里写图片描述
  • 代码:

#include <iostream>
using namespace std;

//抽象处理者
class Handler
{
public:
    Handler() { m_pNextHandler = NULL; }
    virtual ~Handler() {}

    //设置下一个处理者
    void SetNextHandler(Handler *successor) { m_pNextHandler = successor; }

    //处理请求
    virtual void HandleRequest(int days) = 0;
protected:
    Handler *m_pNextHandler;  // 后继者
};


//具体处理者、主管
class Director :public Handler
{
public:
    //处理请求
    virtual void HandleRequest(int days)
    {
        if (days <= 1)
        {
            cout << "我是主管,有权批准一天假,同意了!" << endl; 
        }
        else
        {
            m_pNextHandler->HandleRequest(days);
        }
    }
};

//具体处理者、经理
class Manager :public Handler
{
public:
    //处理请求
    virtual void HandleRequest(int days)
    {
        if (days <= 3)
        {
            cout << "我是经理,有权批准三以下的假,同意了!" << endl;
        }
        else
        {
            m_pNextHandler->HandleRequest(days);
        }
    }
};

//具体处理者、老板
class Boss :public Handler
{
public:
    //处理请求
    virtual void HandleRequest(int days)
    {
        if (days <= 7)
        {
            cout << "我是老板,最多让你请7天假,同意了!" << endl;
        }
        else
        {
            cout << "你请的假事假太长了,不同意!" << endl;
        }
    }
};



//场景
int main()
{
    Handler *director = new Director;
    Handler *manager = new Manager;
    Handler *boss = new Boss;

    //设置责任链
    director->SetNextHandler(manager);
    manager->SetNextHandler(boss);


    director->HandleRequest(1);
    director->HandleRequest(2);
    director->HandleRequest(5);
    director->HandleRequest(8);
    return 0;
}
结果:
我是主管,有权批准一天假,同意了!
我是经理,有权批准三以下的假,同意了
我是老板,最多让你请7天假,同意了!
你请的假事假太长了,不同意!
请按任意键继续. . .

4. 优缺点

  • 优点:
    降低耦合度,将请求的发送者和接收者解耦。
    简化了对象,使得对象不需要知道链的结构。
    增加新的具体处理者很方便,无须修改原有代码,只需要在客户端重新建链即可。
  • 缺点:
    性能问题,每个请求都从头到尾遍历。
    如果建链不当,可能会造成循环调用,这将导致系统陷入死循环

5. 适用场景

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

6. 总结

责任链模式应用场景很明显,需要将请求层层传递给不同的处理者的时候就用它吧。

猜你喜欢

转载自blog.csdn.net/a369189453/article/details/81293075
今日推荐