Java设计模式-责任链模式,应用接口多个参数验证,订单多个费用的计算
Java设计模式-责任链模式,应用接口多个参数验证,订单多个费用的计算
1.定义请求和返回对象的上下文对象
package com.example.core.mydemo.java.filter; import java.time.LocalDateTime; public class OrderReqContext { /** * 租客会员号 */ String memNo; /** * 订单号 */ String orderNo; /** * 开始时间 */ private LocalDateTime requestTime; /** * 返回对象 */ private String responseText; public String getResponseText() { return responseText; } public void setResponseText(String responseText) { this.responseText = responseText; } public String getMemNo() { return memNo; } public void setMemNo(String memNo) { this.memNo = memNo; } public String getOrderNo() { return orderNo; } public void setOrderNo(String orderNo) { this.orderNo = orderNo; } public LocalDateTime getRequestTime() { return requestTime; } public void setRequestTime(LocalDateTime requestTime) { this.requestTime = requestTime; } }
2.定义异常对象
package com.example.core.mydemo.java.filter; public class OrderFilterException extends RuntimeException{ private String errorCode; /** * 异常的描述信息 */ private String errorMsg; /** * 异常可能附加的对象,方便前端输出展示 */ private Object extra; public OrderFilterException(String errorCode, String errorMsg,Throwable cause) { super(cause); this.errorCode = errorCode; this.errorMsg = errorMsg; this.extra = null; } public OrderFilterException(String errorCode, String errorMsg,Object extra,Throwable cause) { super(cause); this.errorCode = errorCode; this.errorMsg = errorMsg; this.extra = extra; } public OrderFilterException(String errorCode, String errorMsg,Object extra) { super(errorMsg); this.errorCode = errorCode; this.errorMsg = errorMsg; this.extra = extra; } public OrderFilterException(String errorCode,String errorMsg){ super(errorMsg); this.errorCode =errorCode; this.errorMsg =errorMsg; } public String getErrorCode() { return errorCode; } public void setErrorCode(String errorCode) { this.errorCode = errorCode; } public String getErrorMsg() { return errorMsg; } public void setErrorMsg(String errorMsg) { this.errorMsg = errorMsg; } public Object getExtra() { return extra; } public void setExtra(Object extra) { this.extra = extra; } }
3.定义接口
package com.example.core.mydemo.java.filter; public interface OrderFilter { /** * 检查该订单的请求是否合法,如果不合法,将抛出OrderFilterException * @param requestContext */ public void validate(OrderReqContext requestContext) throws OrderFilterException; }
4.定义责任链类
package com.example.core.mydemo.java.filter; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.util.ArrayList; import java.util.List; @Service public class OrderFilterChain implements OrderFilter, ApplicationContextAware { private List<OrderFilter> orderFilterList = new ArrayList<>(); private ApplicationContext applicationContext; /** * 单元测试类模拟 */ public void initTest(){ /* 参数检测 */ orderFilterList.add(new ParamsFilter()); /** 节假日检测 **/ orderFilterList.add(new HolidayFilter()); /** other其他 **/ } /** * 容器启动时候加载 */ @PostConstruct private void init(){ /* 参数检测 */ orderFilterList.add(applicationContext.getBean(ParamsFilter.class)); /** 节假日检测 **/ orderFilterList.add(applicationContext.getBean(HolidayFilter.class)); /** other其他 **/ } @Override public void validate(OrderReqContext context) throws OrderFilterException { if(orderFilterList.size()==0){ throw new RuntimeException("cannot be init"); } for(OrderFilter filter: orderFilterList){ filter.validate(context); } } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } }
5.实现类1
package com.example.core.mydemo.java.filter; import com.google.gson.Gson; import org.springframework.stereotype.Service; @Service("holidayFilter") public class HolidayFilter implements OrderFilter { @Override public void validate(OrderReqContext requestContext) throws OrderFilterException{ requestContext.setResponseText("节假日"); System.out.println("节假日检测完成,参数=" + new Gson().toJson(requestContext)); } }
6.实现类2
package com.example.core.mydemo.java.filter; import com.google.gson.Gson; import org.springframework.stereotype.Service; @Service("paramsFilter") public class ParamsFilter implements OrderFilter { @Override public void validate(OrderReqContext requestContext) throws OrderFilterException{ requestContext.setResponseText("参数"); System.out.println("参数检测完成,参数="+ new Gson().toJson(requestContext)); } }
7.测试类
package com.example.core.mydemo.java.filter; import java.time.LocalDateTime; /** * 参数检测完成,参数={"memNo":"123111","orderNo":"DD123456789","requestTime":{"date":{"year":2024,"month":4,"day":19},"time":{"hour":17,"minute":50,"second":57,"nano":943000000}},"responseText":"参数"} * 节假日检测完成,参数={"memNo":"123111","orderNo":"DD123456789","requestTime":{"date":{"year":2024,"month":4,"day":19},"time":{"hour":17,"minute":50,"second":57,"nano":943000000}},"responseText":"节假日"} * 返回对象=节假日 */ public class FilterTest { public static void main(String[] args) { OrderFilterChain orderFilterChain = new OrderFilterChain(); //初始化 orderFilterChain.initTest(); //前置检查 OrderReqContext orderReqContext = initContext(); //验证参数 orderFilterChain.validate(orderReqContext); System.out.println("返回对象=" + orderReqContext.getResponseText()); } private static OrderReqContext initContext() { OrderReqContext orderReqContext = new OrderReqContext(); orderReqContext.setOrderNo("DD123456789"); orderReqContext.setMemNo("123111"); orderReqContext.setRequestTime(LocalDateTime.now()); return orderReqContext; } }