设计模式--职责链模式(Chain of Responsibility Pattern)

职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它为请求创建了一个接收者对象的链。

这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在职责链模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象无法处理请求,那么它会把相同的请求传给下一个接收者,依此类推。

职责链模式主要包含以下角色:

  1. 抽象处理者(Handler):定义了一个处理请求的接口,通常包含一个指向下一个处理者的引用。
  2. 具体处理者(Concrete Handler):具体处理者接收到请求后,可以选择将请求处理掉,或者将请求传给下一个处理者。
  3. 客户类(Client):客户类负责将请求发送到链上,开始请求的处理。

职责链模式主要解决的问题是,请求的发送者不知道接收者是谁,也不知道请求的处理过程。请求在所有的处理者对象中传递,直到被某个处理者处理。这样实现了请求发送者和接收者之间的解耦。

以下是一个简单的职责链模式的 C++ 实现:

c 复制代码
#include <iostream>

// 抽象处理者
class Handler {
public:
    virtual ~Handler() {}
    virtual void setNext(Handler* handler) = 0;
    virtual void handleRequest(int request) = 0;
};

// 具体处理者
class ConcreteHandler1 : public Handler {
public:
    ~ConcreteHandler1() {
        delete next;
    }
    void setNext(Handler* handler) override {
        next = handler;
    }
    void handleRequest(int request) override {
        if (request == 1) {
            std::cout << "ConcreteHandler1 handled the request." << std::endl;
        } else if (next) {
            next->handleRequest(request);
        }
    }
private:
    Handler* next = nullptr;
};

class ConcreteHandler2 : public Handler {
public:
    ~ConcreteHandler2() {
        delete next;
    }
    void setNext(Handler* handler) override {
        next = handler;
    }
    void handleRequest(int request) override {
        if (request == 2) {
            std::cout << "ConcreteHandler2 handled the request." << std::endl;
        } else if (next) {
            next->handleRequest(request);
        }
    }
private:
    Handler* next = nullptr;
};

// 客户端代码
int main() {
    Handler* handler1 = new ConcreteHandler1;
    Handler* handler2 = new ConcreteHandler2;
    handler1->setNext(handler2);
    handler1->handleRequest(1);
    handler1->handleRequest(2);
    delete handler1;
    return 0;
}

在这个例子中,ConcreteHandler1 和 ConcreteHandler2 是具体的处理者,它们都继承自抽象处理者 Handler。当接收到请求时,如果 ConcreteHandler1 能处理请求,就处理请求;否则,就将请求传递给下一个处理者 ConcreteHandler2。ConcreteHandler2 的处理逻辑与此类似。

相关推荐
KaMeidebaby9 分钟前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
ttod_qzstudio1 小时前
【软考设计模式】外观模式:复杂子系统的“门面“封装与代码填空精讲
设计模式·外观模式
醉城夜风~1 小时前
Java详解经典算法题:接雨水(三种实现方案+原理剖析)
java·开发语言·算法
数智化转型推荐官3 小时前
2026统一身份管理系统五大发展趋势解读
java·运维·微服务
看菜鸡互3 小时前
探索用 SlideML 让大模型生成 PPT 的实验方法
java·运维
程序员张34 小时前
SpringBoot集成BCrypt密码加密库
java·spring boot·后端
闲猫4 小时前
Spring AI Agentic 模式(第1部分):Agent Skills——模块化、可复用的能力
java·人工智能·spring
源图客5 小时前
云途物流API开发-鉴权认证(Java)
java·网络·python
liguojun20255 小时前
篮球馆自动计时收费系统:从规则配置到自动结算的全流程拆解
java·大数据·运维·人工智能·物联网·1024程序员节
952365 小时前
RabbitMQ-基础操作
java·spring boot·分布式·后端·spring·rabbitmq