设计模式实际应用-策略模式

devtools/2024/9/22 8:42:04/

1、使用场景

关键业务中使用大量的if else 判断,此时可以使用策略模式进行优化

2、应用

场景1:当入参为1时,执行计费的逻辑,入参为2时执行退费的逻辑,需要入参和出参的

// 计费
if (chargeOrReturnReq.getCalcMode() == 1) {String useCode = doLowCharge(detailsList);
....
}
// 退费
if (chargeOrReturnReq.getCalcMode() == 2) {String refundCode = doLowRefund(detailsList);....
}

使用策略模式优化

优化后此处代码为

// Map.get方法根据key获取对应的策略,key = 1计费 key=2 退费,返回的是对应计费或者退费的方法
Function<List<HisLowChargeDetails>, List<HisLowChargeOrReturnRes>> listStringFunction = DO_LOW_CHARGE_OR_REFUND_STRATEGY.get(chargeOrReturnReq.getCalcMode());
// 方法.apply 调用具体的计费/退费方法并获取返回值
List<HisLowChargeOrReturnRes> resOneList = listStringFunction.apply(detailsList);

策略类

package com.miyite.consumables.modules.external.strategy;import cn.hutool.extra.spring.SpringUtil;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.*;
import java.util.function.Function;@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class HisChargeOrRefundStrategy {// 业务中需要的依赖注入private static HisChargeItemDao hisChargeItemDao;private static HisLowChargeDetailsDao hisLowChargeDetailsDao;private static HwfRefundService hwfRefundService;private static HwfUseDetailsDao hwfUseDetailsDao;private static HwfWarehouseInDetailsDao hwfWarehouseInDetailsDao;private static HwfUseService hwfUseService;private static void setContext() {// 使用hutool类获取Bean对象hisChargeItemDao = SpringUtil.getBean(HisChargeItemDao.class);hisLowChargeDetailsDao = SpringUtil.getBean(HisLowChargeDetailsDao.class);hwfRefundService = SpringUtil.getBean(HwfRefundService.class);hwfUseDetailsDao = SpringUtil.getBean(HwfUseDetailsDao.class);hwfWarehouseInDetailsDao = SpringUtil.getBean(HwfWarehouseInDetailsDao.class);// 使用hutool类获取Bean对象hwfUseService = SpringUtil.getBean(HwfUseService.class);}// 策略的Map集合 value是一个方法 方法中第一个调用本策略的 是入参  第二个是出参public static final Map<Integer, Function<List<HisLowChargeDetails>, List<HisLowChargeOrReturnRes>>> DO_LOW_CHARGE_OR_REFUND_STRATEGY = new HashMap<>();static {/* 计费策略 */DO_LOW_CHARGE_OR_REFUND_STRATEGY.put(1, HisChargeOrRefundStrategy::doLowCharge);/* 退费策略 */DO_LOW_CHARGE_OR_REFUND_STRATEGY.put(2,HisChargeOrRefundStrategy::doLowRefund);}private static List<HisLowChargeOrReturnRes> doLowCharge(List<HisLowChargeDetails> detailsList) {setContext();..计费业务..}private static List<HisLowChargeOrReturnRes> doLowRefund(List<HisLowChargeDetails> detailsList) {setContext();..退费业务..}}

场景2 登录方式有PC端登录 PDA登录,有多个入参,并且不需要出参的

1、调用本策略的代码

// 执行终端身份认证
TerminalAuthentication terminalAuthentication = TERMINAL_STRATEGY.get(loginInfo.getSource());terminalAuthentication.executeAuthentication(loginInfo, request, response, chain);

2、策略模式接口

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** 终端认证*/
@FunctionalInterface
public interface TerminalAuthentication {/*** 执行认证** @param loginInfo 登录信息* @param request   请求对象* @param response  响应对象* @param chain     过滤器链*/void executeAuthentication(LoginInfo loginInfo, HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException;
}

3、策略模式

import com.auth0.jwt.interfaces.Claim;import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.stream.Collectors;import static com.medical.nurse.cache.keys.SecurityRedisKey.LOGINED_ITEM_PERMISSION;
import static com.medical.nurse.cache.keys.SecurityRedisKey.LOGINED_ITEM_TOKEN;/*** 终端认证策略*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class TerminalAuthenticationStrategy {/*** 定义不同终端的认证实现*/public static final Map<LoginSource, TerminalAuthentication> TERMINAL_STRATEGY = new HashMap<>();/* 初始化终端认证策略 */static {/* PC端认证策略 */TERMINAL_STRATEGY.put(LoginSource.PC, (loginInfo, request, response, chain) -> {// pc端登录认证逻辑......});/* PDA端认证策略 */TERMINAL_STRATEGY.put(LoginSource.PDA, (loginInfo, request, response, chain) -> {// pc端登录认证逻辑......});}}

理论参考


http://www.ppmy.cn/devtools/88845.html

相关文章

MATLAB源代码|蚁群算法寻找最近的路线

蚁群算法 蚁群算法是一种优化算法&#xff0c;灵感来源于蚂蚁在寻找食物过程中的行为。它模拟了蚂蚁相互之间合作的行为&#xff0c;通过蚂蚁对于环境的反馈和信息交流&#xff0c;来寻找问题的最优解。 蚁群算法通常应用于求解组合优化问题&#xff0c;例如旅行商问题&#…

Gemini Pro 加持,谷歌 AI 笔记 Notebook LM 重磅升级!

在现在这种信息爆炸的时代&#xff0c;如何高效处理海量信息&#xff0c;已经成为困扰很多人的难题。如何整合来自不同来源的信息和想法&#xff0c;并在它们之间建立联系。这个过程&#xff0c;费时费力&#xff0c;还很容易让人抓狂&#xff0c;更别提还要从中提炼、归纳、整…

MyBatis动态SQL

目录 1、动态SQL &#xff08;1&#xff09;什么是动态SQL? &#xff08;2&#xff09;常用的动态SQL元素 2、if元素 3、choose 、when 、otherwise元素 &#xff08;1&#xff09;为什么使用choose元素 &#xff08;2&#xff09;choose元素的功能 4、trim 、where …

unplugin-vue-components 插件配置 忽略 部分目录下的组件自动导入

背景 vue3 项目 为了省略 第三方库ui 组件 全局组件的注册代码&#xff0c;使用了 unplugin-vue-components 插件 原理 组件识别 在编译阶段&#xff0c;unplugin-vue-components 会扫描 Vue 单文件组件&#xff08;.vue 文件&#xff09;的模板部分&#xff0c;识别出所有使…

SSH配置命令

前置环境&#xff1a;端口配置IP地址&#xff0c;client和server之间可ping通&#xff0c;此处省略 server端: 开启stelnet [Huawei]stelnet server enable Info: Succeeded in starting the Stelnet server. aaa模式相关配置 #进入aaa模式 [Huawei]aaa # 添加用户admin和…

【RabbitMQ】RabbitMQ发布确认概述

一、基本概念 发布确认是指当生产者&#xff08;Producer&#xff09;发送消息到RabbitMQ后&#xff0c;RabbitMQ会向生产者发送一个确认消息&#xff0c;告知消息是否已经被成功接收和持久化。如果消息得到确认&#xff0c;生产者可以安全地假设消息已经成功处理&#xff1b;…

设计模式实战:任务调度系统的设计与实现

问题描述 设计一个任务调度系统,支持任务的创建、调度、执行和状态管理。系统需要确保任务的执行过程可以被灵活调度,并且支持任务状态的跟踪和通知功能。 设计分析 命令模式 命令模式用于将请求封装成对象,从而使我们可以用不同的请求、队列或日志来参数化其他对象。任…

LeetCode Hot100 零钱兑换

给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无限的。 示…