设计模式(017)行为型之责任链模式

news/2024/5/19 14:24:45 标签: 设计模式, 责任链模式

        责任链模式,它允许你将请求沿着处理者链传递,直到有一个处理者能够处理该请求为止。在责任链模式中,有三个核心角色:请求者(Client)、处理者(Handler)、以及具体处理者(ConcreteHandler)。
① 请求者(Client):负责创建请求对象,并将其发送到处理者链中。
② 处理者(Handler):定义一个处理请求的接口,并且持有下一个处理者的引用。
③ 具体处理者(ConcreteHandler):实现处理请求的具体逻辑,如果自己无法处理该请求,则将请求传递给下一个处理者。
责任链模式的核心思想是将请求发送者与接收者解耦,让多个对象都有机会处理请求,从而避免了请求发送者与接收者之间的直接耦合关系

1、场景设计

实现场景:构建一个责任链,责任链上有A、B两个节点,A能够处理A相关的事务,B在A之后,可处理B相关的事务。所有事务首先到A,再到B。

2、C++实现

`Request` 类表示一个请求,包含了请求的内容。`Handler` 是处理者接口,定义了一个纯虚的 `handleRequest()` 方法,以及一个设置下一个处理者的方法。`ConcreteHandlerA` 和 `ConcreteHandlerB` 是具体处理者,实现了处理请求的具体逻辑。在 `main()` 函数中,我们创建了两个具体处理者,将它们串成一个处理者链,并将请求发送给第一个处理者来处理。 

#include <iostream>
#include <string>

// 请求类
class Request {
    private:
        std::string content;

    public:
        Request(const std::string& c) : content(c) {}

        std::string getContent() const {
            return content;
        }
};

// 处理者接口
class Handler {
    private:
        Handler* successor;

    public:
        Handler() : successor(nullptr) {}

        void setSuccessor(Handler* s) {
            successor = s;
        }

        virtual void handleRequest(const Request& request) = 0;

    protected:
        void passToNext(const Request& request) {
            if (successor != nullptr) {
                successor->handleRequest(request);
            }
        }
};

// 具体处理者A
class ConcreteHandlerA : public Handler {
    public:
        void handleRequest(const Request& request) override {
            if (request.getContent() == "A") {
                std::cout << "ConcreteHandlerA is handling the request." << std::endl;
            } else {
                passToNext(request);
            }
        }
};

// 具体处理者B
class ConcreteHandlerB : public Handler {
    public:
        void handleRequest(const Request& request) override {
            if (request.getContent() == "B") {
                std::cout << "ConcreteHandlerB is handling the request." << std::endl;
            } else {
                passToNext(request);
            }
        }
};

int main() {
    ConcreteHandlerA handlerA;
    ConcreteHandlerB handlerB;

    handlerA.setSuccessor(&handlerB);

    Request requestA("A");
    Request requestB("B");
    Request requestC("C");

    handlerA.handleRequest(requestA);
    handlerA.handleRequest(requestB);
    handlerA.handleRequest(requestC);

    return 0;
}

3、Java实现

`Request` 类表示一个请求,包含了请求的内容。`Handler` 是处理者接口,定义了一个处理请求的方法 `handleRequest()`。`ConcreteHandlerA` 和 `ConcreteHandlerB` 是具体处理者,实现了处理请求的具体逻辑,并在需要时将请求传递给下一个处理者。在 `main()` 方法中,我们创建了两个具体处理者,将它们串成一个处理者链,并将请求发送给第一个处理者来处理。 

package behavioralpattern.chain;

public class ChainOfResponsibilityDemo {
    // 请求类
    static class Request {
        private String content;
        public Request(String content) {
            this.content = content;
        }
        public String getContent() {
            return content;
        }
    }
    // 处理者接口
    interface Handler {
        void handleRequest(Request request);
    }
    // 具体处理者A
    static class ConcreteHandlerA implements Handler {
        private Handler successor;
        public void setSuccessor(Handler successor) {
            this.successor = successor;
        }
        @Override
        public void handleRequest(Request request) {
            if (request.getContent().equals("A")) {
                System.out.println("ConcreteHandlerA is handling the request.");
            } else if (successor != null) {
                successor.handleRequest(request);
            }
        }
    }
    // 具体处理者B
    static class ConcreteHandlerB implements Handler {
        private Handler successor;
        public void setSuccessor(Handler successor) {
            this.successor = successor;
        }
        @Override
        public void handleRequest(Request request) {
            if (request.getContent().equals("B")) {
                System.out.println("ConcreteHandlerB is handling the request.");
            } else if (successor != null) {
                successor.handleRequest(request);
            }
        }
    }

    public static void main(String[] args) {
        ConcreteHandlerA handlerA = new ConcreteHandlerA();
        ConcreteHandlerB handlerB = new ConcreteHandlerB();

        handlerA.setSuccessor(handlerB);

        Request requestA = new Request("A");
        Request requestB = new Request("B");
        Request requestC = new Request("C");

        handlerA.handleRequest(requestA);
        handlerA.handleRequest(requestB);
        handlerA.handleRequest(requestC);
    }
}

http://www.niftyadmin.cn/n/5480717.html

相关文章

Linux命令-dpkg-reconfigure命令(Debian Linux中重新配制一个已经安装的软件包)

说明 dpkg-reconfigure命令 是Debian Linux中重新配置已经安装过的软件包&#xff0c;可以将一个或者多个已 安装的软件包传递给此指令&#xff0c;它将询问软件初次安装后的配置问题。 当用户需要再次对软件包配置的时候&#xff0c;可以使用dpkg-reconfigure命令来对指定的软…

【MATLAB 分类算法教程】_3麻雀搜索算法优化支持向量机SVM分类 - 教程和对应MATLAB代码

分类代码案例3:麻雀搜索算法优化支持向量机SVM分类 - MATLAB完全代码教程 1. 初始化代码2.读取数据代码3.数据预处理代码4.利用麻雀搜索算法SSA求解最佳的SVM参数c和g代码5.根据最佳的参数进行SVM模型训练代码6.SVM模型预测代码7.准确率分析以及分类结果对比作图代码本文以红酒…

【Java基础题型】矩阵的对角线求和

一、题目-矩阵 求一个33矩阵对角线元素之和。 输入格式 矩阵 输出格式 主对角线 副对角线 元素和 样例输入 1 2 3 1 1 1 3 2 1 样例输出 3 7 二、参考的知识 这里给大家送点英语单词&#xff0c;记得学习&#xff1a; p r i m a r y. adj.主要的&#xff1b;初…

vulhub之ActiveMQ篇

ActiveMQ的web控制台分三个应用&#xff0c;admin、api和fileserver&#xff0c;其中admin是管理员页面&#xff0c;api是接口&#xff0c;fileserver是储存文件的接口&#xff1b;admin和api都需要登录后才能使用&#xff0c;fileserver无需登录。fileserver是一个RESTful API…

蓝桥杯 2021 省 AB 2 洛谷P8755 负载均衡

[蓝桥杯 2021 省 AB 2] 负载均衡 题目描述 有 n n n 台计算机,第 i i i 台计算机的运算能力为 v i v_{i} vi​ 。 有一系列的任务被指派到各个计算机上,第 i i i 个任务在 a i a_{i} ai​ 时刻分配,指定计算机编号为 b i b_{i} bi​, 耗时为 c i c_{i} ci​ 且算力…

R语言记录过程

如何使用这个函数as.peakData 函数构造过程 出现问题是缺少函数的问题 up不告诉我&#xff0c;这里是代表c,h,o的值&#xff0c;你从里面获取把值&#xff0c;设置成c,h,o就可以了 现在开始测试参数 第一次 startRow : 开始查找数据的第一行。不管startRow的值是多少&#xff…

Java中的Lambda表达式和函数式接口

在Java中&#xff0c;Lambda表达式和函数式接口是Java 8引入的两个重要特性&#xff0c;它们共同为Java带来了函数式编程的能力。 Lambda表达式 Lambda表达式&#xff08;也称为闭包或匿名函数&#xff09;是一种简洁地表示可传递的代码块的方式。它可以没有参数&#xff0c;也…

纯纯python实现梯度下降、随机梯度下降

最近面试有要求手撕SGD&#xff0c;这里顺便就把梯度下降、随机梯度下降、批次梯度下降给写出来了 有几个注意点&#xff1a; 1.求梯度时注意label[i]和pred[i]不要搞反&#xff0c;否则会导致模型发散 2.如果跑了几千个epoch&#xff0c;还是没有收敛&#xff0c;可能是学习率…