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;
    }
}