问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

设计模式之责任链模式详解

创作时间:
作者:
@小白创作中心

设计模式之责任链模式详解

引用
1
来源
1.
https://www.cnblogs.com/jilodream/p/18374509

责任链模式是面向对象设计模式中的一种行为模式,通过将请求处理者串联成链表结构,实现请求的逐级处理。本文通过一个新员工入职流程的案例,详细介绍了责任链模式的核心思想、应用场景以及具体实现方法。

责任链模式简介

责任链模式(Chain of Responsibility),顾名思义,就是将每一个处理请求的处理器组合成一个链表,链表中的每个节点(执行器)都有机会处理发送的请求。其大致结构如下:

案例分析:新员工入职流程

假设某公司新员工入职流程分为三步:

  1. 签订劳动合同
  2. 员工信息入库
  3. 下发工卡

按照责任链模式设计,类图如下:

代码实现

处理器接口

package com.example.demo.learn.pattern.behavior.responsibilitychain;

public interface IHandler {
    boolean handle(Employee employee);
}

合同处理器

package com.example.demo.learn.pattern.behavior.responsibilitychain;

public class CardHandler implements IHandler{
    @Override
    public boolean handle(Employee employee) {
        System.out.println("制作工牌:工号"+employee.getId()+" 姓名:"+employee.getName());
        return true;
    }
}

协议处理器

package com.example.demo.learn.pattern.behavior.responsibilitychain;

public class ContractHandler implements IHandler {
    @Override
    public boolean handle(Employee employee) {
        System.out.println("签订合同:" + employee);
        return true;
    }
}

系统流程处理器

package com.example.demo.learn.pattern.behavior.responsibilitychain;

import java.util.Date;

public class SystemHandler implements IHandler {
    @Override
    public boolean handle(Employee employee) {
        long id = new Date().getTime();
        employee.setId(id);
        System.out.println("员工信息登入到系统中: " + employee);
        return true;
    }
}

员工类:业务实体

package com.example.demo.learn.pattern.behavior.responsibilitychain;

import lombok.Data;

@Data
public class Employee {
    private Long id;
    private String name;
}

主类:责任链的编排和请求调用

package com.example.demo.learn.pattern.behavior.responsibilitychain;

public class PatternMain {
    public static void main(String[] args) {
        ContractHandler contractHandler = new ContractHandler();
        SystemHandler systemHandler = new SystemHandler();
        CardHandler cardHandler = new CardHandler();

        EntryChain entry = new EntryChain(contractHandler, systemHandler, cardHandler);
        String name = "小z";
        boolean result = entry.process(name);
        if (result) {
            System.out.println(name + "的入职流程已经处理完");
        }
    }
}

执行效果如下:

Connected to the target VM, address: '127.0.0.1:63269', transport: 'socket'
签订合同:Employee(id=null, name=小z)
员工信息入库: Employee(id=1724316937102, name=小z)
制作工牌:工号1724316937102 姓名:小z
小z的入职流程已经全部处理完
Disconnected from the target VM, address: '127.0.0.1:63269', transport: 'socket'

核心思路

  1. 定义一个接口规范每个执行器的执行方法(如IHandler接口)。
  2. 定义具体执行器实现类(如ContractHandler、SystemHandler等)。
  3. 使用链表编排执行器的执行顺序。

应用场景

  1. 流程编排(如电子流工单处理)
  2. 资源使用(申请、使用、释放资源)
  3. 日志记录、权限过滤、请求预处理(如AOP切面编程)

为什么使用责任链模式?

  • 业务流程复杂且经常变动时,便于维护。
  • 符合开闭原则,易于扩展和调整执行顺序。

变形与扩展

  1. 节点保存在每个责任链节点的next引用处,形成单链表结构。
  2. 可以中途结束返回,也可以依次执行每个节点。
  3. 大型流程可能跨多个服务,不仅仅是方法编排。

总结

设计模式重在理解核心思想,应根据实际场景灵活应用,而不是生搬硬套。责任链模式提供了一种灵活的流程处理方式,适用于需要动态调整处理顺序的场景。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号