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. 基于DataWorks搭建新零售数据中台

    文章作者:许日(欢伯),在2016年盒马早期的时候,转到盒马事业部作为在线数据平台的研发负责人,现任阿里云计算平台DataWorks建模引擎团队负责人. 文章简介:本篇文章向大家分享新零售企业如何基于 ...

  2. HarmonyOS 实战开发-Worker子线程中解压文件

    介绍 本示例介绍在Worker子线程使用@ohos.zlib提供的zlib.decompressfile接口对沙箱目录中的压缩文件进行解压操作,解压成功后将解压路径返回主线程,获取解压文件列表. 效果 ...

  3. [Go] freecache 设置 SetGCPercent 的作用

    你需要对 freecache 有一个大致了解,freecache 的内存空间是预分配的. 假设你的程序占用了 50M 内存,那么开启 freecache 预分配 200M 空间,总共下来就是 250M ...

  4. Vue2源码解析-源码调试与核心流程梳理图解

    现在VUE3已经有一段时间了,也慢慢普及起来了.不过因为一直还在使用VUE2的原因还是去了解和学了下它的源码,毕竟VUE2也不会突然就没了是吧,且VUE3中很多原理之类的也是类似的.然后就准备把VUE ...

  5. laravel-cms学习笔记

    学习地址: https://www.houdunren.com/edu/video/12045 laravel 文档地址: https://gitee.com/houdunren/code/blob/ ...

  6. CSRF(Pikachu靶场练习)

    CSRF(get) 自己随便输点东西,回显登录失败,查看源码没发现什么 点开提示,登录进去看看 看到可以修改个人信息,我们把居住改成China,修改成功,没发现urlhttp://127.0.0.1/ ...

  7. Echarts设置饼状图保证你看的明明白白

    简单的饼状图 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  8. Js中valueOf和toString区别和使用

    对于number.string.Boolean.object.symbol数据类型调用valueOf方法,得到的都是数据本身(null.undefined两种类型上的原型链上没有valueOf方法) ...

  9. 已经调试成功的Protues工程用了一段时间后不能用的问题

    已经调试成功的Protues工程,经过一段时间后不能用的问题 主要现象:(1)可以打开,运行时没有效果:(2)可以打开,运行时闪退 解决办法:(1)删除原ARM芯片:(2)重新找到ARM芯片,重新加载 ...

  10. C语言中四舍五入问题总结

    C语言中四舍五入问题的总结 在C语言中大部分情况下都是不需要四舍五入的. 除了一种情况:在使用输出函数 printf()限制浮点型输出的小数位个数 eg: printf("%0.2f&quo ...