其他分享
首页 > 其他分享> > 第二十四章-职责链模式

第二十四章-职责链模式

作者:互联网

职责链模式(Chain of Responsibility): 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。

职责链的好处是当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。使得接受者和发送者都没有对方的明确消息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持他所有的候选接受者的引用。不过也要当心,一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。

图片

 

加薪代码

图片

#include <iostream>
#include<vector>
#include<string>
#include<ctime>

using namespace std;

class Request
{
private:
    string requestType;
    string requestContent;
    int number;
public:
    string getRequestType() { return requestType; }
    void setSequestType(string requestType_t) { requestType = requestType_t; }

    string getRequestContent() { return requestContent; }
    void setRequestContent(string requestContent_t) { requestContent = requestContent_t; }

    int getNumber() { return number; }
    void setNumber(int number_t) { number = number_t; }
};

class Manager
{
protected:
    string name;
    Manager* superior;

public:
    Manager(string name_t)
    {
        name = name_t;
    }

    void SetSuperior(Manager* superior_t)
    {
        superior = superior_t;
    }

    virtual void RequestApplications(Request* request) = 0;
};

class CommonManager :public Manager
{
public:
    CommonManager(string name_t)
        :Manager(name_t)
    { }

    void RequestApplications(Request* request)
    {
        if (request->getRequestType() == "请假" && request->getNumber() <= 2)
        {
            cout << request->getRequestType() << "数量" << request->getNumber() << " 被批准" << endl;
        }
        else
        {
            if (superior != nullptr)
                superior->RequestApplications(request);
        }
    }
};

class Majordomo :public Manager
{
public:
    Majordomo(string name_t)
        :Manager(name_t)
    { }

    void RequestApplications(Request* request)
    {
        if (request->getRequestType() == "请假" && request->getNumber() <= 5)
        {
            cout << request->getRequestType() << "数量" << request->getNumber() << " 被批准" << endl;
        }
        else
        {
            if (superior != nullptr)
                superior->RequestApplications(request);
        }
    }
};

class GeneralManager :public Manager
{
public:
    GeneralManager(string name_t)
        :Manager(name_t)
    { }

    void RequestApplications(Request* request)
    {
        if (request->getRequestType() == "请假")
        {
            cout << request->getRequestType() << "数量" << request->getNumber() << " 被批准" << endl;
        }
        else if (request->getRequestType() == "加薪" && request->getNumber() <= 500)
        {
            cout << request->getRequestType() << "数量" << request->getNumber() << " 被批准" << endl;
        }
        else if (request->getRequestType() == "加薪" && request->getNumber() > 500)
        {
            cout << request->getRequestType() << "数量" << request->getNumber() << " 再说吧" << endl;
        }
    }
};


int main()
{
    CommonManager* jingli = new CommonManager("经理");
    Majordomo* zongjian = new Majordomo("总监");
    GeneralManager* zongjingli = new GeneralManager("总经理");
    jingli->SetSuperior(zongjian);
    zongjian->SetSuperior(zongjingli);

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


    system("pause");
    return 0;
}

标签:string,getNumber,request,模式,name,getRequestType,Manager,第二十四章,职责
来源: https://www.cnblogs.com/wfcg165/p/12052794.html