使用场景:多个连续的功能上不相互依赖的处理环节,共同完成一项任务。
特点:(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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {
@AutowiredStrategyHandle strategyHandle;
@AutowiredStrategyCheck strategyCheck;
@AutowiredStrategyCalculate strategyCalculate;
public void execute(Object obj){strategyHandle.setStrategyInterface(strategyCheck);strategyCheck.setStrategyInterface(strategyCalculate);strategyCalculate.setStrategyInterface(null);strategyHandle.execute(obj);}
}
(7)测试
@SpringBootTest
@Slf4j
class Demo17ApplicationTests {
@AutowiredStrategyService strategyService;
@Testvoid contextLoads() {strategyService.execute(new Object());}
}
