基于Spring的责任链模式
Spring环境参考:https://blog.youkuaiyun.com/zhi_zixing/article/details/133487881https://blog.youkuaiyun.com/zhi_zixing/article/details/133487881
代码
Context
package ai.zixing.vo;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
@Getter
@Setter
@ToString
@Accessors(chain = true)
public class Context {
/**
* ID
*/
private Integer id;
/**
* 上下文信息
*/
private String contextInfo = "context";
}
HandleIntercept
package ai.zixing.filter;
import ai.zixing.vo.Context;
public interface HandleIntercept {
/**
* 业务逻辑
*
* @param context context
* @return Context
*/
Context handle(Context context);
}
AHandleInterceptService
package ai.zixing.filter;
import ai.zixing.vo.Context;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Order(10)
@Component
public class AHandleInterceptService implements HandleIntercept {
@Override
public Context handle(Context context) {
context.setContextInfo(context.getContextInfo() + "_A");
System.out.println(context);
return context;
}
}
BHandleInterceptService
package ai.zixing.filter;
import ai.zixing.vo.Context;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Order(20)
@Component
public class BHandleInterceptService implements HandleIntercept {
@Override
public Context handle(Context context) {
context.setContextInfo(context.getContextInfo() + "_B");
System.out.println(context);
return context;
}
}
CHandleInterceptService
package ai.zixing.filter;
import ai.zixing.vo.Context;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Order(30)
@Component
public class CHandleInterceptService implements HandleIntercept {
@Override
public Context handle(Context context) {
context.setContextInfo(context.getContextInfo() + "_C");
System.out.println(context);
return context;
}
}
HandleChainService
package ai.zixing.service;
import ai.zixing.filter.HandleIntercept;
import ai.zixing.vo.Context;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* 获取IOC容器
*/
@Component
public class HandleChainService {
@Resource
private List<HandleIntercept> handleList;
/**
* 执行处理
*/
public Context execute(Context context, int chainBegin) {
for (int i = chainBegin - 1; i < handleList.size(); i++) {
context = handleList.get(i).handle(context);
}
// for (HandleIntercept handleIntercept : handleList) {
// context = handleIntercept.handle(context);
// }
return context;
}
}
ChainController
package ai.zixing.controller;
import ai.zixing.vo.Context;
import ai.zixing.service.HandleChainService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class ChainController {
@Resource
private HandleChainService orderHandleChainService;
@GetMapping("/test")
public void explainPlan(@RequestParam("chainIndex") int chainIndex) {
orderHandleChainService.execute(new Context(), chainIndex);
}
}
测试接口 GET http://localhost:8080/test?chainIndex=1