长生栈 长生栈
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Living Team

编程技术分享
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 创建型模式

  • 结构型模式

  • 行为型模式

    • 责任链模式(Chain of Responsibility Pattern)
      • 概念
      • 思想
      • 角色
      • 优点
      • 缺点
      • 类图
      • 示例代码
    • 命令模式(Command Pattern)
    • 解释器模式(Interpreter Pattern)
    • 迭代器模式(Iterator Pattern)
    • 中介者模式(Mediator Pattern)
    • 备忘录模式(Memento Pattern)
    • 观察者模式(Observer Pattern)
    • 状态模式(State Pattern)
    • 策略模式(Strategy Pattern)
    • 模板方法模式(Template Method Pattern)
    • 访问者模式(Visitor Pattern)
  • 设计模式
  • 行为型模式
DC Wang
2023-05-28
目录

责任链模式(Chain of Responsibility Pattern)

# 责任链模式(Chain of Responsibility Pattern)

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许你将请求沿着处理链进行传递,直到有一个处理者能够处理该请求。该模式将请求的发送者和接收者解耦,使多个对象都有机会处理该请求,而不是将请求的发送者与接收者紧密耦合在一起。

# 概念

责任链模式建立了一条处理请求的链,每个处理者都有机会处理请求,直到请求被成功处理或者到达链的末尾。请求会依次在链上传递,直到找到可以处理请求的处理者为止。

# 思想

责任链模式的核心思想是将请求的发送者和接收者解耦,使得多个对象都有机会处理请求。请求会依次经过链上的处理者,每个处理者根据自己的处理能力来决定是否处理请求,从而实现请求的传递和处理。

# 角色

  1. Handler(处理者):定义一个处理请求的接口,通常包含一个指向下一个处理者的引用。
  2. ConcreteHandler(具体处理者):实现处理请求的方法,如果自己能够处理请求,则进行处理;否则将请求传递给下一个处理者。
  3. Client(客户端):创建处理链并将请求发送给链中的第一个处理者。

# 优点

  1. 解耦发送者和接收者:请求发送者不需要知道请求由哪个具体处理者处理,只需将请求发送给链的第一个处理者即可,接收者也不需要知道请求的发送者是谁。
  2. 灵活性和可扩展性:可以动态地添加或修改处理者,灵活调整处理链的顺序或结构。
  3. 可以处理请求的变动:新增、删除或重新排序处理者时,对客户端代码没有影响。

# 缺点

  1. 无法保证请求被处理:如果整个处理链没有处理请求,请求可能会被忽略或者无法处理。
  2. 可能导致性能问题:由于请求需要经过多个处理者,如果处理链过长或者处理者处理请求的时间过长,可能会影响整体性能。

# 类图

@startuml
class Client {
  +sendRequest()
}

class Handler {
  -nextHandler: Handler
  +setNextHandler(Handler)
  +handleRequest()
}

class ConcreteHandlerA {
  +handleRequest()
}

class ConcreteHandlerB {
  +handleRequest()
}

class ConcreteHandlerC {
  +handleRequest()
}

Client --> Handler
Handler "1" --> "0..1" Handler
Handler <|-- ConcreteHandlerA
Handler <|-- ConcreteHandlerB
Handler <|-- ConcreteHandlerC
@enduml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# 示例代码

以下是使用C++编写的示例代码:

#include <iostream>

// Handler(处理者)
class Handler {
protected:
    Handler* nextHandler;

public:
    void setNextHandler(Handler* handler) {
        nextHandler = handler;
    }

    virtual void handleRequest(int request) = 0;
};

// ConcreteHandlerA(具体处理者A)
class ConcreteHandlerA : public Handler {
public:
    void handleRequest(int request) override {
        if (request >= 0 && request < 10) {
            std::cout << "ConcreteHandlerA handles the request: " << request << std::endl;
        } else if (nextHandler != nullptr) {
            nextHandler->handleRequest(request);
        }
    }
};

// ConcreteHandlerB(具体处理者B)
class ConcreteHandlerB : public Handler {
public:
    void handleRequest(int request) override {
        if (request >= 10 && request < 20) {
            std::cout << "ConcreteHandlerB handles the request: " << request << std::endl;
        } else if (nextHandler != nullptr) {
            nextHandler->handleRequest(request);
        }
    }
};

// ConcreteHandlerC(具体处理者C)
class ConcreteHandlerC : public Handler {
public:
    void handleRequest(int request) override {
        if (request >= 20 && request < 30) {
            std::cout << "ConcreteHandlerC handles the request: " << request << std::endl;
        } else if (nextHandler != nullptr) {
            nextHandler->handleRequest(request);
        }
    }
};

int main() {
    // 创建处理者对象
    Handler* handlerA = new ConcreteHandlerA();
    Handler* handlerB = new ConcreteHandlerB();
    Handler* handlerC = new ConcreteHandlerC();

    // 构建处理链
    handlerA->setNextHandler(handlerB);
    handlerB->setNextHandler(handlerC);

    // 发送请求
    handlerA->handleRequest(5);
    handlerA->handleRequest(15);
    handlerA->handleRequest(25);

    // 释放资源
    delete handlerA;
    delete handlerB;
    delete handlerC;

    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

运行结果:

ConcreteHandlerA handles the request: 5
ConcreteHandlerB handles the request: 15
ConcreteHandlerC handles the request: 25
1
2
3

以上示例代码中,定义了三个具体处理者(ConcreteHandlerA、ConcreteHandlerB、ConcreteHandlerC)和一个客户端(Client)。每个具体处理者负责处理一定范围的请求,如果自己无法处理请求,则将请求传递给下一个处理者。在客户端中创建处理者对象,并构建处理链,然后发送请求。根据处理链的设置,每个请求会依次经过处理者进行处理,直到找到能够处理请求的处理者为止。输出结果显示每个请求由相应的处理者处理。

编辑 (opens new window)
#设计模式#行为型模式
上次更新: 2023/06/09, 13:17:31
代理模式(Proxy Pattern)
命令模式(Command Pattern)

← 代理模式(Proxy Pattern) 命令模式(Command Pattern)→

最近更新
01
ESP32-网络摄像头方案
06-14
02
ESP32-PWM驱动SG90舵机
06-14
03
ESP32-实时操作系统freertos
06-14
更多文章>
Theme by Vdoing | Copyright © 2019-2025 DC Wang All right reserved | 辽公网安备 21021102001125号 | 吉ICP备20001966号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式