[学习][笔记]设计模式(基于C/C++实现)<十一>责任链模式

简介: [学习][笔记]设计模式(基于C/C++实现)<十一>责任链模式

责任链模式

定义

责任链模式(Chain of Responsibility)使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象能够处理它。

使用场景

链式流程化处理。

例如请假审批流程。

基本思路

创建请求(request 待处理数据)创建多个处理节点(processor),每个节点指定其下一个处理节点。

在起始节点传入请求,最后会通过处理节点条件 判断会有哪些节点处理。

例如:请假审批,[0,1] 天要有Leader1审批

[1,7] 天要有Leader1,Leader2审批

[7,30] 要有Leader1,Leader2,Leader3审批

比如张三请教5天,正常流程需要Leader1,Leader2

张三请教8天,正常流程需要Leader1,Leader2,Leader3

当然这个处理流程可以根据 handlerRequest 的处理条件 来改变。

实现

#ifndef ABSTRACTPROCESSOR_H
#define ABSTRACTPROCESSOR_H
#include <LeaveRequest.h>
class AbstractProcessor{
public:
        /**直接主管审批处理的请假天数**/
        const static int MIN = 1;
        /**部门经理处理的请假天数**/
        const static int MIDDLE = 7;
        /**总经理处理的请假天数**/
        const static int MAX = 30;
        /**领导名称*/
        std::string handlerName;
        /**下一个处理节点(即更高级别的领导)**/
        AbstractProcessor* nextHandler = nullptr;
        /**设置下一节点**/
        void setNextHandler(AbstractProcessor *handler){
            this->nextHandler = handler;
        }
        /**处理请假的请求,子类实现**/
        virtual void handlerRequest(LeaveRequest* request) = 0;
};
#endif // ABSTRACTPROCESSOR_H
#ifndef LEADER1PROCESSOR_H
#define LEADER1PROCESSOR_H
#include <AbstractProcessor.h>
#include <stdio.h>
class Leader1Processor:public AbstractProcessor{
public:
    void handlerRequest(LeaveRequest* request) override{
        if(request->m_iLeaveDays >= AbstractProcessor::MIN){
            printf("Leader1:%s,proceess,finished!\n",handlerName.c_str());
            if(nullptr != this->nextHandler){
                printf("Leader1 ->next \n");
                this->nextHandler->handlerRequest(request);
            }else{
                printf("process reject\n");
            }
        }else{
            printf("not %s duty\n",handlerName.c_str());
            return;
        }
    }
};
#endif // LEADER1PROCESSOR_H
#ifndef LEADER2PROCESSOR_H
#define LEADER2PROCESSOR_H
#include <AbstractProcessor.h>
#include <stdio.h>
class Leader2Processor:public AbstractProcessor{
public:
    void handlerRequest(LeaveRequest* request) override{
        if(request->m_iLeaveDays >=AbstractProcessor::MIDDLE){
            printf("Leader2:%s,proceess,finished!\n",handlerName.c_str());
            if(nullptr != this->nextHandler){
                printf("Leader2 ->next \n");
                this->nextHandler->handlerRequest(request);
            }else{
                printf("process reject;\n");
            }
        }else{
            printf("not %s duty\n",handlerName.c_str());
            return;
        }
    }
};
#endif // LEADER1PROCESSOR_H
#ifndef LEADER3PROCESSOR_H
#define LEADER3PROCESSOR_H
#include <AbstractProcessor.h>
#include <stdio.h>
class Leader3Processor:public AbstractProcessor{
public:
    void handlerRequest(LeaveRequest* request) override{
        if(request->m_iLeaveDays<=AbstractProcessor::MAX){
            printf("Leader3:%s,proceess,finished!\n",handlerName.c_str());
            if(nullptr != this->nextHandler){
                printf("Leader3 ->next \n");
                this->nextHandler->handlerRequest(request);
            }else{
                printf("process end;\n");
            }
        }else{
            printf("not %s duty\n",handlerName.c_str());
            return;
        }
    }
};
#endif // LEADER1PROCESSOR_H
#ifndef LEAVEREQUEST_H
#define LEAVEREQUEST_H
#include <string>
class LeaveRequest{
public:
    int m_iLeaveDays;
    std::string m_strName;
};
#endif // LEAVEREQUEST_H

main

#include <iostream>
using namespace std;
#include <AbstractProcessor.h>
#include <Leader1Processor.h>
#include <Leader2Processor.h>
#include <Leader3Processor.h>
int main()
{
    LeaveRequest request;
    Leader1Processor processor1;
    processor1.handlerName = "Leader1";
    Leader2Processor processor2;
    processor2.handlerName = "Leader2";
    Leader3Processor processor3;
    processor3.handlerName = "Leader3";
    processor1.setNextHandler(&processor2);
    processor2.setNextHandler(&processor3);
    request.m_iLeaveDays = 20;
    request.m_strName = "Shiver";
    printf("%s request Leave for %d\n",request.m_strName.c_str(),request.m_iLeaveDays);
    printf("request start\n");
    processor1.handlerRequest(&request);
    printf("request end\n");
    return 0;
}

总结

demo地址

1、责任链模式使用场景

相对于原数据进行处理比较好,设定总体处理流程。

2、责任链模式与装饰器模式

装饰器模式更像是加上额外功能,每次处理过后原数据都需要转成另一种数据(类)。

3、责任链模式和拦截过滤器模式区别


相关文章
|
19天前
|
设计模式 存储 Java
「全网最细 + 实战源码案例」设计模式——责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,允许将请求沿着处理者链进行发送。每个处理者可以处理请求或将其传递给下一个处理者,从而实现解耦和灵活性。其结构包括抽象处理者(Handler)、具体处理者(ConcreteHandler)和客户端(Client)。适用于不同方式处理不同种类请求、按顺序执行多个处理者、以及运行时改变处理者及其顺序的场景。典型应用包括日志处理、Java Web过滤器、权限认证等。
56 13
「全网最细 + 实战源码案例」设计模式——责任链模式
|
1月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
59 16
|
2月前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
70 4
2023/11/10学习记录-C/C++对称分组加密DES
|
2月前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
48 2
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
43 2
|
3月前
|
设计模式 Java Kotlin
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
60 2
|
3月前
|
设计模式 Java API
Kotlin教程笔记(50) - 改良设计模式 - 工厂模式
Kotlin教程笔记(50) - 改良设计模式 - 工厂模式
57 2
|
3月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
61 1
|
3月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
57 1
|
3月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
54 3