责任链模式
责任链模式
一条链路,按照顺序执行,中间出现问题,可以退出return
常用与参数校验,接入层的相关处理逻辑
固定套路
1.定义数据处理模型基类
public interface ProcessModel {
}
2.抽象Context里包含数据处理模型,处理器之间传递context
使用到了泛型上限的特性,限制只能实现了ProcessModel的数据对象进context进行处理
@Data
@Builder
public class ProcessContext<T extends ProcessModel> {
T processModel;
Boolean needBreak; // 是否需要跳出的标志位
BasicResultVO response; // 返回结构
}
3.定义处理器接口
public interface BusinessProcessor<T extends ProcessModel> {
void process(ProcessContext<T> context);
}
4.定义一个数据模型实现ProcessModel
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
@Accessors(chain = true)
public class NotificationModel implements ProcessModel {
public Map<NotifyMethod,AlarmNotificationDto> alarmNotificationMap;
public String ruleKey;
public String ruleGroupKey;
public long processTime;
public long timestamp;
public AlarmLevel level;
public String metric;
public String endpoint;
public String appEnName;
public String labels;
public AlarmNotificationMqData originalMqData;
public ResourceType resourceType;
public List<NotifyMethod> notifyMethods;
}
5.定义处理器的实现类,通过泛型传递过来是NotificationModel模型
@Component
@Order(10)
public class PreCheckProcessor implements BusinessProcessor<NotificationModel>{
@Resource
AlarmRuleNewMapper alarmRuleNewMapper;
@Resource
AlarmRuleTemplateNewMapper alarmRuleTemplateNewMapper;
@Resource
RelationAlarmRuleNotifyMethodMapper relationAlarmRuleNotifyMethodMapper;
@Override
public void process(ProcessContext<NotificationModel> context) {
// condition
if (条件){
context.setNeedBreak(true);
context.setResponse(BasicResultVO.fail("告警规则模板通知开关状态:关闭"))
return
}
}
}
接着写后面的处理类,里面Order注解指定不同的数字,数字越大,越后执行
6.生成责任链路,按照链路执行
@Component
public class ProcessorChain {
@Resource
List<BusinessProcessor> processorList;
public ProcessContext process(ProcessContext context){
for (BusinessProcessor processor : processorList) {
processor.process(context);
if (context.needBreak){
break;
}
}
return context;
}
}
7.测试
创建NotificationModel,传递进ProcessContext里,用责任链执行
// 创建ProcessModel
NotificationModel notificationModel = NotificationModel.builder().originalMqData(mqObj).build();
// 生成运行时context
ProcessContext<ProcessModel> processContext = ProcessContext.builder()
.processModel(notificationModel).needBreak(false)
.response(BasicResultVO.success())
.build();
processorChain.process(processContext);
8.流程审批可以用这个模式
原创:做时间的朋友
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2020-12-30 如何估值1