责任链模式

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

特点:(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());
    }
}
相关推荐
Data_Journal33 分钟前
用于网页抓取的 Node-unblocker
大数据·开发语言·数据库·python·scrapy
吴声子夜歌34 分钟前
Java面试——算法
java·算法·面试
evans在进步1 小时前
LeetCode 64:最小路径和——Java 原地动态规划详解
java·leetcode·动态规划
豆角焖肉1 小时前
SSM 聚合项目搭建:多 Maven 模块项目
开发语言·python·pycharm
Frank_refuel1 小时前
【C++八股】面向对象
开发语言·c++
m0_380743872 小时前
为 OpenAI 兼容接口配置教程
开发语言·python·node.js
凤山老林2 小时前
Spring Boot 3.x AOT 编译实战:从原理、踩坑到生产落地
java·spring boot·后端
博傅2 小时前
Spring 核心原理
java·后端·spring
yurenpai(27届找实习中)3 小时前
从零读懂 AI 智能客服(一):模块职责与 SSE 聊天链路(后端架构)
java·人工智能·架构·langchain4j
万邦科技Lafite3 小时前
阿里巴巴拍立淘按图搜索商品API返回值实践:提升用户购物满意度的关键措施
开发语言·api·开放api·电商开放平台·京东开放平台