责任链模式

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

特点:(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());
    }
}
相关推荐
艺杯羹6 分钟前
数据库连接池技术与 Druid 连接工具类实现
java·数据库·mysql·jdbc
火兮明兮8 分钟前
Python训练第三十天
开发语言·python
我爱Jack9 分钟前
Mybatis操作数据库(2)
java·数据库·mybatis
啊我不会诶11 分钟前
CF每日4题(1300-1400)
开发语言·c++·算法
学编程的小白狼25 分钟前
C#:多线程
开发语言·c#
island131425 分钟前
JAVA Web 期末速成
java·开发语言·前端
珊瑚里的鱼30 分钟前
【滑动窗口】LeetCode 1004题解 | 最大连续1的个数 Ⅲ
开发语言·c++·笔记·算法·leetcode
使者大牙31 分钟前
【C语言基础语法入门】通过简单实例快速掌握C语言核心概念
c语言·开发语言
2401_895610821 小时前
Java 后端基础 Maven
java·开发语言·maven
LAM LAB1 小时前
【VBA/word】批量替换字体大小
开发语言·c#·word