责任链模式

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

特点:(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());
    }
}
相关推荐
「QT(C++)开发工程师」28 分钟前
【C++实现UDP客户端】
开发语言·c++·udp
虽千万人 吾往矣2 小时前
golang gin入门
开发语言·后端·网络协议·tcp/ip·golang·gin
2401_857439693 小时前
医院管理新篇章:Spring Boot技术驱动
java·spring boot·后端
satan–04 小时前
R语言绘制面积图
开发语言·windows·vscode·信息可视化·r语言·数据可视化
_麦麦_5 小时前
[C++]——多态
开发语言·c++
zhouzhurong5 小时前
C语言scanf用%d读入字符型变量,通过输入字符的ASCII码输入字符
c语言·开发语言·算法
@@@wang5 小时前
模拟实现消息队列(基于SpringBoot实现)
java·spring
api茶飘香5 小时前
淘宝商品评论API返回值中的品牌忠诚度评价
开发语言·python·django·flask·virtualenv·pygame·tornado
liuxin334455665 小时前
春意盎然:Spring Boot驱动的“衣依”服装销售平台
java·spring boot·后端