欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > 责任链模式

责任链模式

2024/10/24 4:27:58 来源:https://blog.csdn.net/m0_57801749/article/details/142791036  浏览:    关键词:责任链模式

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

特点:(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());}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com