ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第二十四章-职责链模式

2019-12-17 10:06:10  阅读:208  来源: 互联网

标签:string getNumber request 模式 name getRequestType Manager 第二十四章 职责


职责链模式(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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有