【24种设计模式】责任链模式

news/2024/5/19 12:27:59 标签: 设计模式, 责任链模式, java

责任链模式是一种行为设计模式,它允许你将请求沿着处理链进行传递,直到有一个处理者能够处理该请求为止。这种模式将请求的发送者和接收者解耦,使多个对象都有机会处理该请求。

责任链模式的结构

责任链模式由以下几个角色组成:

  1. 抽象处理者(Handler):定义了处理请求的接口,并维护一个指向下一个处理者的引用。
  2. 具体处理者(ConcreteHandler):实现了处理请求的方法,如果自己不能处理该请求,则将请求传递给下一个处理者。
  3. 客户端(Client):创建具体处理者的链,并将请求发送给第一个处理者。

示例代码

以下是一个简单的示例,展示了如何在一个餐厅点餐系统中使用责任链模式

首先,定义一个抽象处理者接口:

java">public interface OrderHandler {
    void setNextHandler(OrderHandler nextHandler);
    void handleOrder(Order order);
}

然后,创建具体处理者类,分别处理不同类型的订单:

java">public class OnlineOrderHandler implements OrderHandler {
    private OrderHandler nextHandler;

    @Override
    public void setNextHandler(OrderHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleOrder(Order order) {
        if (order.getType().equals("online")) {
            // 处理在线订单的逻辑
            System.out.println("处理在线订单:" + order);
        } else {
            // 将请求传递给下一个处理者
            nextHandler.handleOrder(order);
        }
    }
}

public class PhoneOrderHandler implements OrderHandler {
    private OrderHandler nextHandler;

    @Override
    public void setNextHandler(OrderHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleOrder(Order order) {
        if (order.getType().equals("phone")) {
            // 处理电话订单的逻辑
            System.out.println("处理电话订单:" + order);
        } else {
            // 将请求传递给下一个处理者
            nextHandler.handleOrder(order);
        }
    }
}

public class WalkInOrderHandler implements OrderHandler {
    private OrderHandler nextHandler;

    @Override
    public void setNextHandler(OrderHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleOrder(Order order) {
        if (order.getType().equals("walk-in")) {
            // 处理现场订单的逻辑
            System.out.println("处理现场订单:" + order);
        } else {
            // 将请求传递给下一个处理者
            nextHandler.handleOrder(order);
        }
    }
}

在每个具体处理者中,根据订单的类型来判断是否能够处理该订单。如果能够处理,则执行相应的业务逻辑;否则,将订单传递给下一个处理者。

最后,在客户端创建处理者链并使用它来处理订单:

java">public class OrderHandlerChain {
    private OrderHandler firstHandler;

    public void addHandler(OrderHandler handler) {
        if (firstHandler == null) {
            firstHandler = handler;
        } else {
            OrderHandler currHandler = firstHandler;
            while (currHandler.getNextHandler() != null) {
                currHandler = currHandler.getNextHandler();
            }
            currHandler.setNextHandler(handler);
        }
    }

    public void handleOrder(Order order) {
        if (firstHandler != null) {
            firstHandler.handleOrder(order);
        }
    }
}

public class Client {
    public static void main(String[] args) {
        OrderHandlerChain chain = new OrderHandlerChain();

        // 创建具体处理者
        OrderHandler onlineHandler = new OnlineOrderHandler();
        OrderHandler phoneHandler = new PhoneOrderHandler();
        OrderHandler walkInHandler = new WalkInOrderHandler();

        // 构建处理者链
        chain.addHandler(onlineHandler);
        chain.addHandler(phoneHandler);
        chain.addHandler(walkInHandler);

        // 创建订单
        Order order1 = new Order("online");
        Order order2 = new Order("phone");
        Order order3 = new Order("walk-in");

        // 处理订单
        chain.handleOrder(order1);
        chain.handleOrder(order2);
        chain.handleOrder(order3);
    }
}

在客户端的 main() 方法中,创建了具体处理者和处理者链,并构建了一个包含不同类型订单处理逻辑的责任链。然后,通过链式调用处理者的 handleOrder() 方法,将订单传递给责任链进行处理。

责任链模式的使用场景

责任链模式适用于以下情况:

  • 当你希望多个对象都有机会处理请求,并且你不确定哪个对象会处理请求时。
  • 当你希望在不显式指定接收者的情况下,将请求的发送者和接收者解耦。
  • 当你希望动态地指定处理对象集合,并在处理链中添加或移除处理者时。

常见的应用场景包括:

  • 日志记录系统:可以将日志请求沿着处理链传递,由不同的处理器负责处理不同级别的日志。
  • 请求过滤器:可以使用责任链模式来处理请求过滤逻辑,例如对请求进行权限验证、防止恶意请求等。
  • 用户界面事件处理:可以使用责任链模式来处理用户界面事件,例如鼠标点击、键盘输入等。

责任链模式可以帮助我们构建松耦合、灵活和可扩展的系统。通过使用责任链模式,我们可以轻松地添加、修改或移除处理者,以适应不同的业务需求。

希望这篇博客推文能够帮助你理解责任链模式,并在实际开发中得到应用!如果还有其他问题,请随时提问。


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

相关文章

力扣刷题-哈希表-判断两个字符串_其他中元素是否一致

242 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s “anagram”, t “nagaram” 输出: true 示例 2: 输入: s “rat”, t “car” 输出: false 说明: 你可以假设字符串只包含小写字母。 解释&#x…

Windows 下安装及配置 MySQL 8.1 (图文教程)

目录 下载 MySQL安装 MySQL配置 MySQL修改密码配置环境变量 卸载 MySQL开源项目微服务商城项目前后端分离项目 下载 MySQL 访问 MySQL 下载地址:https://dev.mysql.com/downloads/mysql/ 下载 MySQL 时,你可以选择 ZIP 包或 MSI 安装: ZIP包…

【Git】配置SSH密钥实现Git操作免密

背景 在使用Git推送代码的时候,会默认需要输入密码。如果经常推送代码,那就需要经常输入密码,比较繁琐。所以Git也提供了免密登录的功能。 Git本身支持两种协议对远程Git仓库进行访问:HTTPS、SSH。两种方式有一定的区别&#xf…

解决mac pro 连接4k显示器严重发烫、卡顿问题

介绍个不用花钱的方法。其实mac自带的风扇散热能力还可以的,但是默认比较懒散,可以用一个软件来控制下,激发下它的潜能。 可以下个stats软件 打开传感器开关,以及同步控制风扇开关 以及cpu显示温度 点击控制台上的温度图标&…

23.8.18 牛客暑期多校10部分题解

L - Grayscale Confusion 题目大意 有 n n n 个三元组 { r i , g i , b i } \{r_i,\space g_i,\space b_i\} {ri​, gi​, bi​},需要构造一个数组 w i w_i wi​ 使得 w 1 w 2 w_1w_2 w1​w2​ 并且对于 ∀ i , j \forall i,\space j ∀i, j 满足如果 r i &…

基于FPGA的图像形态学膨胀算法实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 在FPGA中仿真结果如下所示: 将FPGA中的仿真结果导入到matlab显示二维图,效果如下: 2.算法运行软件版本 matla…

肖sir___环境的讲解详情__002

一、环境讲解 1、jdk 什么是JDK?JDK的作用? JDK是java语言的软件开发工具包,能解释java程序,编译java语言,没有jdk的话无法编译Java程序。 包含了各种类库和工具,机器不是直接识别语言的,会借助…

c++ 模版元编程 算法

元素访问算法 元素访问算法用于访问元素或成员&#xff0c;如std::get、std::tuple_size、std::tuple_element等。例如&#xff1a; #include <tuple> #include <iostream>int main() {std::tuple<int, float, char> t(42, 3.14, a);std::cout << s…