首页 > 编程语言 >Java设计模式-责任链模式,应用接口多个参数验证,订单多个费用的计算

Java设计模式-责任链模式,应用接口多个参数验证,订单多个费用的计算

时间:2024-04-21 09:44:05浏览次数:14  
标签:Java String 多个 errorMsg void errorCode import 设计模式 public

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

 

标签:Java,String,多个,errorMsg,void,errorCode,import,设计模式,public
From: https://www.cnblogs.com/oktokeep/p/18148612

相关文章

  • Java面试题:请谈谈对ThreadLocal的理解?
    ThreadLocal是一种特殊的变量存储机制,它提供了一种方式,可以在每个线程中保存数据,而不会受到其他线程的影响。这种机制在多线程编程中非常有用,因为它允许每个线程拥有自己的数据副本,从而避免了数据竞争和线程之间的干扰,以空间换时间。在Java中,ThreadLocal的实现主要涉及到三个类:Th......
  • [转帖]十年拉锯战终结束,Google 赢得 Java API 版权诉讼
    https://www.oschina.net/news/136073/googles-wins-lawsuit Google和Oracle(甲骨文)在法庭上就Android操作系统中Java编程语言的使用问题争吵了十年。美国最高法院在周一以6比2的投票结果裁定,Google对Java代码的使用被归为"合理使用",没有违反联邦版权法......
  • [转帖]Oracle 败了、谷歌赢了:Java API 版权案最终裁决
    https://zhuanlan.zhihu.com/p/362496136 周一,最高法院在Oracle围绕移动操作系统Android中所用软件的一起旷日持久的版权诉讼中判谷歌胜诉。法院的判决为6比2。大法官AmyConeyBarrett没有参与此案。该案涉及谷歌用于构建Android的12000行代码,这些代码是从SunMicrosy......
  • Solon Java 应用开发框架 v2.7.5 发布
    JavaSolon是什么框架?Java“新的”应用开发框架。从零开始构建(非java-ee架构),有灵活的接口规范与开放生态。追求:更快、更小、更简单提倡:克制、简洁、高效、开放、生态有什么特点?更高的计算性价比:并发高2~3倍;内存省50%更快的开发效率:内核小,入门快;调试重启快5......
  • 最新Java面试题带答案【2024中级】
    互联网大厂面试题1:阿里巴巴Java面试题2:阿里云Java面试题-实习生岗3:腾讯Java面试题-高级4:字节跳动Java面试题5:字节跳动Java面试题-大数据方向6:百度Java面试题7:蚂蚁金服Java面试题-中级8:蚂蚁金服Java面试题-高级9:京东Java面试题-中级10:拼多多Java面试题-电商部11:商汤科技......
  • java 异步任务,定时任务,邮件发送
    java异步任务,定时任务,邮件异步任务异步方法注解:@Async主程序开启异步注解功能:@EnableAsync定时任务开启定时功能的注解在main:@EnableSchedulingTaskScheduler:任务调用者TaskExecutor:任务执行者@EnableScheduling开启定时功能的注解@Scheduled固定......
  • Java 安全基础之 Java 反射机制和 ClassLoader 类加载机制
    目录Java反射机制反射java.lang.RuntimeClassLoader类加载机制URLClassLoaderJava反射机制Java反射(Reflection)是Java非常重要的动态特性。在运行状态中,通过Java的反射机制,我们能够判断一个对象所属的类。了解任意一个类的所有属性和方法。能够调用任意一个对象的任意方......
  • java Swagger 使用汇总
    Swagger1.Swagger简介最流行的api框架restfulapi在线自动生成工具:api文档与api定义同步更新直接运行,可以在线测试api接口支持多种语言:java,php2.官网https://swagger.io在项目中使用swagger需要springboxswagger2ui3.SpringBoot集成Swaggerhttps://mvnreposito......
  • Java面试题:为什么HashMap不建议使用对象作为Key?
    HashMap是一种基于哈希表的动态数据结构,它允许使用任意不可变对象作为键(key)来存储和检索数据。然而,在某些情况下,使用对象作为HashMap的键可能会遇到一些问题。 首先,我们需要明确对象作为HashMap的键需要满足一些条件:不可变性:对象的属性不能被修改,因为如果属性被修改,那......
  • System.AggregateException: 发生一个或多个错误.....
    System.AggregateException:发生一个或多个错误。--->Microsoft.WebTools.Shared.Exceptions.WebToolsException:生成失败。检查输出窗口了解更多详细信息。---内部异常堆栈跟踪的结尾------>(内部异常#0)Microsoft.WebTools.Shared.Exceptions.WebToolsException:生......