美文网首页
责任链模式

责任链模式

作者: 钟离惜 | 来源:发表于2020-10-30 15:35 被阅读0次

责任链模式属于数据结构模式。
使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象链成一条链,并沿着这条链传递该请求/命令,直到有对象处理它为止。
责任链模式它包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象,该模式还描述了往该链添加新的处理对象的方法。

辛辛苦苦了工作了一年,终于可以加薪了,向主管提交了加薪申请,主管一看不得了,自己职权不够,批不了,主管把申请上交总监,总监发现自己也批不了,申请到了总经理手中,总经理一看,小伙子口气不小了,有胆识敢申请,先来谈下心。预知后事如何,请看下回分解。

这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。

示例代码

#include <iostream>
#include <string>
using namespace std;

// 请求
class Request
{
public:
    int m_nNumber;
};

// 管理者
class Manager
{
public:
    Manager(string temp) { name = temp; }
    void SetSuccessor(Manager* temp) { manager = temp; }
    virtual void GetRequest(Request* request) = 0;
protected:
    Manager* manager;
    string name;
};

// 经理
class CommonManager : public Manager
{
public:
    CommonManager(string strTemp) : Manager(strTemp) {}
    virtual void GetRequest(Request* request);
};

void CommonManager::GetRequest(Request* request)
{
    if (request->m_nNumber >= 0 && request->m_nNumber < 1000)
    {
        cout << name << " 处理了请求: " << request->m_nNumber << endl;
    }
    else
    {
        manager->GetRequest(request);
    }
}

// 总监
class Majordomo : public Manager
{
public:
    Majordomo(string strTemp) : Manager(strTemp) {}
    virtual void GetRequest(Request* request);
};

void Majordomo::GetRequest(Request* request)
{
    if (request->m_nNumber <= 5000)
    {
        cout << name << " 处理了请求: " << request->m_nNumber << endl;
    }
    else
    {
        manager->GetRequest(request);
    }
}

//总经理  
class GeneralManager : public Manager
{
public:
    GeneralManager(string name) :Manager(name) {}
    virtual void GetRequest(Request* request)  //总经理可以处理所有请求  
    {
        cout << name << " 处理了请求: " << request->m_nNumber << endl;
    }
};

int main() {

    Manager* common = new CommonManager("张经理");
    Manager* major = new Majordomo("李总监");
    GeneralManager* general = new GeneralManager("赵总");
    common->SetSuccessor(major);
    major->SetSuccessor(general);
    Request* rq = new Request();

    rq->m_nNumber = 999;
    common->GetRequest(rq);

    rq->m_nNumber = 4999;
    common->GetRequest(rq);

    rq->m_nNumber = 6999;
    common->GetRequest(rq);

    delete rq;
    delete major;
    delete common;
    delete general;
    return 0;
}

转载文章
我所理解的设计模式(C++实现)——责任链模式(Chain Of Responsibility Pattern)

相关文章

网友评论

      本文标题:责任链模式

      本文链接:https://www.haomeiwen.com/subject/dwczmktx.html