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设计模式-责任链模式,应用接口多个参数验证,订单多个费用的计算的更多相关文章

  1. 【设计模式】Java设计模式 - 责任链模式

    [设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...

  2. Java设计模式の责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  3. java 设计模式 -- 责任链模式

    设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪 ...

  4. 我的Java设计模式-责任链模式

    今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...

  5. Java设计模式-责任链模式

    提出问题: 最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为 ...

  6. Java设计模式-责任链模式(Chain of Responsibility)

    接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求.但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任 ...

  7. Java设计模式—责任链模式

    责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 责任链模式的重点是在"链& ...

  8. 浅谈Python设计模式 -- 责任链模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 之前在最开始就聊了Python设计模式有三种,其中关于创建型和结构型设计模式基本 ...

  9. Java与设计模式-责任链模式

    责任链模式属于行为型设计模式之中的一个,怎么理解责任链?责任链是能够理解成数个对象首尾连接而成,每个节点就是一个对象.每个对象相应不同的处理逻辑,直至有一个对象响应处理请求结束.这一种模式成为责任链模 ...

  10. php 23种设计模式 - 责任链模式

    责任链模式 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行 ...

随机推荐

  1. Hologres揭秘:优化COPY,批量导入性能提升5倍+

    简介: 揭秘Hologres优化COPY的技术原理,实现批量导入性能提升5倍+ Hologres(中文名交互式分析)是阿里云自研的一站式实时数仓,这个云原生系统融合了实时服务和分析大数据的场景,全面兼 ...

  2. Spring Boot参数校验以及分组校验的使用

    简介: 做web开发基本上每个接口都要对参数进行校验,如果参数比较少,还比较容易处理,一但参数比较多了的话代码中就会出现大量的if-else语句.虽然这种方式简单直接,但会大大降低开发效率和代码可读性 ...

  3. 每天5分钟复习OpenStack(十三)存储缓存技术Bcache

    Ceph作为一个分布式存储,在项目中常见的形态有两者,一种是采用 SSD 或NVME 磁盘做Ceph的日志盘,使用SATA磁盘来做数据盘.这样的好处是比较经济实惠.另一种则是全部采用 SSD 或NVM ...

  4. 笔记04_正确使用Heterogeneous元件

    笔记04_正确使用Heterogeneous元件 1.出现错误的原因,就是一个元件的几个 部分没有分组.比如上一节创建的NE5532_HETE,当这个元件被调用两次或更多次时,存在若干个A,B部分,如 ...

  5. 通俗易懂的生产环境Web应用架构介绍

    前言 看见一篇非常通俗易懂且适合新手阅读的Web应用架构文章,我将其手工翻译了出来,分享给大家. 也可以去阅读英文原文,标题为,贴出链接: https://stephenmann.io/post/wh ...

  6. Solution Set - 组合计数

    CF40E Number Table Link&Submission. 显然 \(n,m\) 奇偶性不同时无解.奇偶性相同时,假设有一行全为空,剩下每行至少一个有空,则除这些位置外没有限制的位 ...

  7. thinkphp5 关于跨域的一些坑,附上解决办法(比较全面了)

    项目背景:前端是uniapp开发的h5,后端是tp5,其他语言我觉得应该大同小异,主要是思路,本文就以这俩为例吧 1.首先在tp5的入口文件:public/index.php 在里面添加三行: // ...

  8. 厉害了!12秒将百万数据通过EasyExcel导入MySQL数据库中

    一.写在开头 我们在上一篇文章中提到了通过EasyExcel处理Mysql百万数据的导入功能(一键看原文),当时我们经过测试数据的反复测验,100万条放在excel中的数据,4个字段的情况下,导入数据 ...

  9. Linux上执行内存中的脚本和程序

    在Linux中可以不需要有脚本或者二进制程序的文件在文件系统上实际存在,只需要有对应的数据在内存中,就有办法执行这些脚本和程序. 原理其实很简单,Linux里有办法把某块内存映射成文件描述符,对于每一 ...

  10. 基于webapi的websocket聊天室(番外一)

    上一篇我已经实现了聊天室,并且在协议中实现了4种类型的消息传输.其实还可以添加video,audio,live等等类型. 不过假如把目前的协议看作RCP1.0版的话,这个版本就只支持有限的4种消息.精 ...