【java】实际项目中责任链模式的应用
实际项目中责任链模式的应用
最近着手进行项目重构,项目中原有责任链的的代码,每次添加新的处理流程,需要重新组装,不方便业务的快速扩展。所以进行了优化处理,别的也不多说,代码如下:
1、首先定义执行链入口
public abstract class AbstractChainHandler { private AbstractChainHandler nextHandler; public void setNextHandler(AbstractChainHandler nextHandler) { this.nextHandler = nextHandler; } protected AbstractChainHandler getNextHandler() { return nextHandler; } public abstract String handleRequest(ChainRequest request); }
2、定义实际业务执行链
/** * 支付业务 */ public abstract class AbstractPaymentHandler extends AbstractChainHandler { }
@Component public class AlipayHandler extends AbstractPaymentHandler{ @Override public String handleRequest(ChainRequest request) { if(request.getType() == 2) { return "alipay"; } Assert.notNull(getNextHandler(), "暂不支持该操作"); return getNextHandler().handleRequest(request); } }
@Component public class WechatPayHandler extends AbstractPaymentHandler{ @Override public String handleRequest(ChainRequest request) { if(request.getType() == 1) { return "wechat pay"; } Assert.notNull(getNextHandler(), "暂不支持该操作"); return getNextHandler().handleRequest(request); } }
2、组装执行链
@Component @Slf4j public class ChainContextHandler implements ApplicationContextAware { private static ApplicationContext applicationContext; private static Map<String, AbstractChainHandler> handlerMap = new HashMap<>(); @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { ChainContextHandler.applicationContext = applicationContext; } private <T extends AbstractChainHandler> AbstractChainHandler getHandler(Class<T> handlerClass) { AbstractChainHandler handler = handlerMap.get(handlerClass.getName()); if(handler != null){ return handler; } Map<String, T> beans = applicationContext.getBeansOfType(handlerClass); AbstractChainHandler chainHandler = null; AbstractChainHandler newHandler = null; for (String key : beans.keySet()) { if(chainHandler == null){ chainHandler = beans.get(key); newHandler = chainHandler; } else { AbstractChainHandler next = beans.get(key); newHandler.setNextHandler(next); newHandler = next; } } handlerMap.put(handlerClass.getName(), chainHandler); return chainHandler; } public <T extends AbstractChainHandler> String handleRequest(ChainRequest request, Class<T> handlerClass){ return getHandler(handlerClass).handleRequest(request); } }
3、业务代码调用
@RestController public class ChainController { @Autowired private ChainContextHandler chainContextHandler; @PostMapping("pay") public String request(ChainRequest request){ return chainContextHandler.handleRequest(request, AbstractPaymentHandler.class); } }
4、请求参数
@Getter @Setter public class ChainRequest { private int type; }
5、测试结果
由于有全局异常捕获,所以返回的error,这里不附捕获的代码
下一篇:
Java设计模式-适配器模式