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. UNO 的 SamplesApp.Skia.Gtk 丢失字体文件抛出空异常

    在运行 UNO 的 SamplesApp.Skia.Gtk 例子程序时,如果没有拷贝字体文件夹,导致字体丢失,将会在运行的时候抛出 NullReferenceException 空异常 抛出的异常堆栈 ...

  2. games101-3 BRDF101

    BRDF101 概述 本文基于知乎Maple对brdf的文章,在此基础又收集了一些其它来源的关于brdf的文章,希望能够完全理解记忆相关知识 关于Jakub Boksansky的文章,看的过程中又去搜 ...

  3. 特权同学笔记-《边练边学》-在QP里调用modelsim的步骤

    在QP里调用Modelsim需要先设置仿真参数和工具路径. 在QP调用modelsim的步骤 1. 在QP里建立工程,代码,分析综合:2. 添加testbench代码,processing-start ...

  4. ClickHouse常用Sql

    -- 删除字段 ALTER TABLE 表名 DROP COLUMN 字段名; -- 新增字段,和字段备注 ALTER TABLE 表名 ADD COLUMN IF NOT EXISTS 字段名 St ...

  5. 生成带重复的笛卡尔乘积过程 Cartesian Product with Repetition

    目录 What is Cartesian Product with Repetition Code Demo What is Cartesian Product with Repetition 比如说 ...

  6. 02、Linux 排查

    Linux 分析排查 1.敏感文件信息 1.1.tmp 目录 /tmp:临时目录文件,每个用户都可以对它进行读写操作.因此一个普通用户可以对 /tmp 目录执行读写操作(ls -alt) 筛查 /tm ...

  7. gorm 关系一对一,一对多,多对多查询

    gorm 关系一对一,一对多,多对多查询 gorm v2版本 Belongs To mysql表 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_IN ...

  8. ansible系列(1)--ansible基础

    目录 1. ansible概述 1.1 ansible的功能 1.2 ansible的特性 1.3 ansible的架构 1.4 ansible注意事项 1. ansible概述 Ansible 是一 ...

  9. RMBG1.4服务器部署指南

    近期,一家AIGC公司BRIA开源了一个出圈的模型:RMBG-1.4,它可以实现高质量地一键去除图片中的背景.下面是一些具体的例子,可以看到这个模型可以实现非常精细的"抠图". R ...

  10. 远程桌面使用Pr剪视频

    要远程访问高性能计算机并使用 Pr(Adobe Premiere Pro)进行视频编辑,您可以考虑使用流畅且响应迅速的远程桌面软件.您可以考虑以下选项. Splashtop Business Acce ...