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;
}
}
Java设计模式-责任链模式,应用接口多个参数验证,订单多个费用的计算的更多相关文章
- 【设计模式】Java设计模式 - 责任链模式
[设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...
- Java设计模式の责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- java 设计模式 -- 责任链模式
设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪 ...
- 我的Java设计模式-责任链模式
今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...
- Java设计模式-责任链模式
提出问题: 最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为 ...
- Java设计模式-责任链模式(Chain of Responsibility)
接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求.但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任 ...
- Java设计模式—责任链模式
责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 责任链模式的重点是在"链& ...
- 浅谈Python设计模式 -- 责任链模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 之前在最开始就聊了Python设计模式有三种,其中关于创建型和结构型设计模式基本 ...
- Java与设计模式-责任链模式
责任链模式属于行为型设计模式之中的一个,怎么理解责任链?责任链是能够理解成数个对象首尾连接而成,每个节点就是一个对象.每个对象相应不同的处理逻辑,直至有一个对象响应处理请求结束.这一种模式成为责任链模 ...
- php 23种设计模式 - 责任链模式
责任链模式 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行 ...
随机推荐
- MaxCompute Spark 资源使用优化祥解
简介: 本文主要讲解MaxCompute Spark资源调优,目的在于在保证Spark任务正常运行的前提下,指导用户更好地对Spark作业资源使用进行优化,极大化利用资源,降低成本. 本文作者:吴数傑 ...
- Python内置数据类型性能分析
timeit模块 timeit模块可以用来测试一小段Python代码的执行速度. class timeit.Timer(stmt='pass', setup='pass', timer=<tim ...
- [Contract] ETH 与 Gas 之间的价格转换关系, Ethereum Gas Price Chart
以太坊网络每天的平均气价(Gas)是变化,有一张价格表:https://etherscan.io/chart/gasprice 然后你可以知道 1 Gas = xx Gwei,再换算一下 1 ETH ...
- NopCommerce支持多种类型的数据库
本文章的内容是根据本人阅读NopCommerce源码的理解,如有不对的地方请指正,谢谢. 阅读目录 1.类结构关系图 2.分析 3.NopCommerce应用 类结构关系图 分析 NopObjectC ...
- 一个可以输出当前移动设备机型(安卓,ios)系统版本的html页面
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue+vant+js实现购物车原理小demo(基础版)
电商毕业设计里的一个购物车demo,拿vue+vant需要写的核心计算代码只有12行.效果图: main.js: Vue.use(Stepper); .vue文件 <template> & ...
- All in One:Prometheus 多实例数据统一管理最佳实践
01 引言 Prometheus 作为目前最主流的可观测开源项目之一,已经成为云原生监控的事实标准,被众多企业广泛应用.在使用 Prometheus 的时候,我们经常会遇到全局视图的需求,但是数据确分 ...
- 16、数据库加固-mysql 加固
1.修改 DBA 登录密码 shell 下执行: mysqladmin -u root password 非首次修改:mysqladmin -u root password -p原密码 在 mysql ...
- jeecgboot项目swagger2在线接口转word
1.先找到接口文档地址 2.根据url获取接口数据 3.利用在线工具进行转换生成word 在线工具地址:在线swagger转word文档 生成的word文档如下:
- 抽丝剥茧:详述一次DevServer Proxy配置无效问题的细致排查过程
事情的起因是这样的,在一个已上线的项目中,其中一个包含登录和获取菜单的接口因响应时间较长,后端让我尝试未经服务转发的另一域名下的新接口,旧接口允许跨域请求,但新接口不允许本地访问(只允许发布测试/生产 ...