责任链模式

使用场景:多个连续的功能上不相互依赖的处理环节,共同完成一项任务。

特点:(1)顺序执行

(2) 有多个处理环节

比较:与观察者模式不同的是,观察者模式中所有的订阅者可并行执行,而责任链模式具有顺序执行的特点;

其次观察者模式中所有的订阅者没有任何关联,而责任链模式中的每个处理环节具有传递性。

模式举例:

(1)公共接口

复制代码
public interface StrategyInterface {
    void execute(Object obj);
}

(2)抽象实现类

复制代码
@Data
public abstract class AbstractStrategy implements StrategyInterface{
​
    protected StrategyInterface  strategyInterface;

    public void next(Object obj){
        if (strategyInterface != null){
            strategyInterface.execute(obj);
        }
    }
}
​

(3)实现类-第一环节

复制代码
@Slf4j
@Component
public class StrategyHandle extends AbstractStrategy {
    @Override
    public void execute(Object obj) {
        try {
            log.info("first StrategyHandle task begin..... ");
            next(obj);
            successHandle(obj);
        }catch (Exception e){
            errorHandle(obj);
        }
    }
​
    private void successHandle(Object obj) {
        log.info("first task success over");
    }
​
    private void errorHandle(Object obj) {
        log.error("first task error");
​
    }
​
​
}

(4)实现类-第二环节

复制代码
@Slf4j
@Component
public class StrategyCheck extends AbstractStrategy {
    @Override
    public void execute(Object obj) {
        log.info("second StrategyCheck task begin......");
        checkBefore(obj);
        next(obj);
        checkAfter(obj);
    }
​
    private void checkAfter(Object obj) {
        log.info("second StrategyCheck task 后置校验");
    }
​
    private void checkBefore(Object obj) {
        log.info("second StrategyCheck task 前置校验");
    }
}

(5)实现类-第三环节

复制代码
@Slf4j
@Component
public class StrategyCalculate extends AbstractStrategy {
    @Override
    public void execute(Object obj) {
        log.info("third StrategyCalculate task begin......");
        calculate(obj);
        next(obj);
    }
    public void calculate(Object obj){
        log.info("third 执行任务。。。");
    }
}
​

(6)组装链式调用

复制代码
@Service
public class StrategyService {
​
    @Autowired
    StrategyHandle strategyHandle;
​
    @Autowired
    StrategyCheck strategyCheck;
​
    @Autowired
    StrategyCalculate strategyCalculate;
​
    public void execute(Object obj){
        strategyHandle.setStrategyInterface(strategyCheck);
        strategyCheck.setStrategyInterface(strategyCalculate);
        strategyCalculate.setStrategyInterface(null);
        strategyHandle.execute(obj);
    }
}

(7)测试

复制代码
@SpringBootTest
@Slf4j
class Demo17ApplicationTests {
​
    @Autowired
    StrategyService strategyService;
​
    @Test
    void contextLoads() {
        strategyService.execute(new Object());
    }
}
相关推荐
m0_587383002 小时前
广州 24 小时自助健身房解决方案技术实现与实战指南
java·spring·小程序·架构·需求分析
·云扬·2 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
专注仿真2 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
Best-Wishes3 小时前
科来网络分析系统(技术交流版)使用说明书
开发语言·junit·php
代码不停3 小时前
自动化测试(java)
java·开发语言·selenium·自动化
鬼手点金5 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
爱上网的小舟5 小时前
星际战士2启动错误怎么办?5种游戏报错解决方法
开发语言·php
paopaokaka_luck6 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
阿里嘎多学长6 小时前
2026-10-12 GitHub 热点项目精选
开发语言·程序员·github·代码托管
Wang's Blog7 小时前
Java 项目实战: 交友项目 - Dubbo 的内部结构与一次调用的完整链路
java·dubbo