设计模式—职责链模式(将要求提交给小领导,每个人都有一个顶头上司,直到有人能处理为止)

职责连模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系

将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止

就拿雇员向领导提出请假和加薪的要求,不同的领导的权限不一样来向上级请示为例子:

#ifndef MANAGER_H
#define MANAGER_H

#include <QString>
#include <QSharedPointer>
#include <QDebug>

class Request
{
public:
    QString getRequestType() const {return _requestType;}
    void setRequestType(QString requestType){_requestType = requestType;}
    QString getRequestContent() const {return _requestContent;}
    void setRequestContent(QString requestContent){_requestContent = requestContent;}
    int getNumber() const {return _number;}
    void setNumber(int number){_number = number;}
private:
    QString _requestType;
    QString _requestContent;
    int _number;
};

class Manager
{
public:
    explicit Manager(QString name)
    {
        _name = name;
    }
    void setSuperior(Manager* superior)
    {
        _superior = QSharedPointer<Manager>(superior);
    }
    virtual void RequestApplications(const Request &) = 0;
    virtual ~Manager(){}
protected:
    QString _name;
    QSharedPointer<Manager> _superior;
};

class CommonManager final : public Manager   //经理类
{
public:
    explicit CommonManager(QString name):Manager(name){}
    void RequestApplications(const Request & request) override
    //注意,函数的参数如果有const实例,则函数里面调用该实例的方法必须是const函数
    {
        if(request.getRequestType() == "请假" && request.getNumber()<=2)
        {
            qDebug()<<_name<<request.getRequestContent()<<request.getNumber()<<"被批准";
        }
        else
        {
            if(_superior!=nullptr)
                _superior->RequestApplications(request);
        }
    }
};

class Majordomo final : public Manager   //总监类
{
public:
    explicit Majordomo(QString name):Manager(name){}
    void RequestApplications(const Request & request) override
    {
        if(request.getRequestType() == "请假" && request.getNumber()<=5)
        {
            qDebug()<<_name<<request.getRequestContent()<<request.getNumber()<<"被批准";
        }
        else
        {
            if(_superior!=nullptr)
                _superior->RequestApplications(request);
        }
    }
};

class GeneralManager final : public Manager   //总经理类
{
public:
    explicit GeneralManager(QString name):Manager(name){}
    void RequestApplications(const Request & request) override
    {
        if(request.getRequestType() == "请假" && request.getNumber()<=500)
        {
            qDebug()<<_name<<request.getRequestContent()<<request.getNumber()<<"被批准";
        }
        else if(request.getRequestType() == "加薪" && request.getNumber()<=500)
        {
           qDebug()<<_name<<request.getRequestContent()<<request.getNumber()<<"被批准";
        }
        else if(request.getRequestType() == "加薪" && request.getNumber()>500)
        {
            qDebug()<<_name<<request.getRequestContent()<<request.getNumber()<<"再说吧";
        }
    }
};

#endif // MANAGER_H
  •  

有了管理者和各个管理者的子类,就可以实现main函数的例子了:

#include "manager.h"

int main()
{
    CommonManager* jinli = new CommonManager("金利");
    Majordomo* zongjian = new Majordomo("宗剑");
    GeneralManager* zhongjingli = new GeneralManager("钟精励");
    jinli->setSuperior(zongjian);
    zongjian->setSuperior(zhongjingli);

    Request* request = new Request();
    request->setRequestType("请假");
    request->setRequestContent("小菜请假");
    request->setNumber(1);
    jinli->RequestApplications(*request);

    Request* request2 = new Request();
    request2->setRequestType("请假");
    request2->setRequestContent("小菜请假");
    request2->setNumber(4);
    jinli->RequestApplications(*request2);

    Request* request3 = new Request();
    request3->setRequestType("加薪");
    request3->setRequestContent("小菜请求加薪");
    request3->setNumber(500);
    jinli->RequestApplications(*request3);

    Request* request4 = new Request();
    request4->setRequestType("加薪");
    request4->setRequestContent("小菜请求加薪");
    request4->setNumber(1000);
    jinli->RequestApplications(*request4);

    return 0;
}

由代码可以看出,职责链模式将一个管理者类抽象出来,然后扩展为三个具体的类(经理类、总监类和总经理类),这样类的灵活性就大大增加!如果我们需要扩展新的管理者,只需要增加子类即可,真的是非常灵活方便!

最后放上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/SalaryRaise_ResponsibilityEven_mode_24

猜你喜欢

转载自blog.csdn.net/jiesunliu3215/article/details/108950450