• 职责链模式(Chain of Responsibility Pattern)


    定义

    职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许对象接收请求并将其沿着处理者链传递,直到有一个处理者处理它为止。职责链模式通过将请求的处理逻辑分布

    在职责链模式中,通常包含以下几个角色:

    1. Handler(处理者):定义处理请求的接口,包含处理请求和设置下一个处理者的方法。

    2. ConcreteHandler(具体处理者):实现处理者接口,处理其负责的请求,如果请求不属于它的责任范围,则将其传递给链中的下一个处理者。

    示例

    下面是一个简单的C++示例,演示了职责链模式的应用:

    1. #include
    2. #include
    3. // 处理者接口
    4. class Handler {
    5. public:
    6. virtual ~Handler() = default;
    7. // 设置下一个处理者
    8. void setNext(Handler* next) {
    9. nextHandler = next;
    10. }
    11. // 处理请求
    12. virtual void handleRequest(const std::string& request) {
    13. if (nextHandler) {
    14. nextHandler->handleRequest(request); // 如果存在下一个处理者,则传递给下一个处理者
    15. } else {
    16. std::cout << "No handler available to handle the request: " << request << std::endl;
    17. }
    18. }
    19. protected:
    20. Handler* nextHandler = nullptr; // 指向下一个处理者的指针
    21. };
    22. // 具体处理者A,负责处理以"A"开头的请求
    23. class ConcreteHandlerA : public Handler {
    24. public:
    25. void handleRequest(const std::string& request) override {
    26. if (request.find("A") == 0) {
    27. std::cout << "ConcreteHandlerA handles the request: " << request << std::endl;
    28. } else {
    29. Handler::handleRequest(request); // 如果请求不属于A处理,则传递给链中的下一个处理者
    30. }
    31. }
    32. };
    33. // 具体处理者B,负责处理以"B"开头的请求
    34. class ConcreteHandlerB : public Handler {
    35. public:
    36. void handleRequest(const std::string& request) override {
    37. if (request.find("B") == 0) {
    38. std::cout << "ConcreteHandlerB handles the request: " << request << std::endl;
    39. } else {
    40. Handler::handleRequest(request); // 如果请求不属于B处理,则传递给链中的下一个处理者
    41. }
    42. }
    43. };
    44. int main() {
    45. // 创建处理者对象并设置职责链
    46. ConcreteHandlerA* handlerA = new ConcreteHandlerA();
    47. ConcreteHandlerB* handlerB = new ConcreteHandlerB();
    48. handlerA->setNext(handlerB);
    49. // 发送请求
    50. handlerA->handleRequest("RequestA"); // 应该由ConcreteHandlerA处理
    51. handlerA->handleRequest("RequestB"); // 应该由ConcreteHandlerB处理
    52. handlerA->handleRequest("RequestC"); // 没有处理者可以处理,输出错误信息
    53. delete handlerA;
    54. delete handlerB;
    55. return 0;
    56. }

    在这个示例中,我们定义了一个Handler接口和两个具体处理者ConcreteHandlerAConcreteHandlerB。每个处理者都包含一个指向下一个处理者的指针,用于构建处理者链。当处理者收到请求时,它首先检查请求是否属于它的责任范围。如果是,则处理该请求;如果不是,则将请求传递给链中的下一个处理者。如果没有处理者能够处理请求,则输出错误信息。

    职责链模式的主要优点包括:

    1. 解耦:发送者和接收者之间的解耦,发送者只需要知道如何向链中传递请求,而不需要知道请求的具体处理者。

    2. 灵活性:可以通过动态地改变链内的处理者来改变请求的处理方式。

    3. 支持多个处理者:允许有多个处理者同时处理一个请求。

    职责链模式的潜在缺点包括:

    1. 性能:如果链中的处理者数量很多,且请求需要逐个传递,可能会导致性能下降。

    2. 请求可能得不到处理:如果没有处理者处理请求,则请求可能会丢失或返回错误。

    在实际应用中,职责链模式常用于处理异常、日志记录、命令模式中的命令执行等场景。

  • 相关阅读:
    《HTML+CSS+JavaScript》之第20章 超链接样式
    Codeforces Round 857
    Linux中如何执行脚本
    方案聚焦:高可用的F5分布式云DNS负载均衡
    微服务框架 SpringCloud微服务架构 10 使用Docker 10.5 容器命令案例2
    以太网PHY原理介绍
    【ICLR 2023】详细解读DreamFusion:用二维diffusion models完成三维生成任务
    【爬虫】第五部分 selenium库
    计算机算法分析与设计(20)---回溯法(0-1背包问题)
    【C++模板】typename关键字的用法
  • 原文地址:https://blog.csdn.net/weixin_40026739/article/details/136322581