行为型模式(一)策略模式
目录
1. 介绍
2. 目的
3. 实践
1. 介绍
策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,将每种算法封装成具体的策略类,并使它们可以互相替换。策略模式使得算法可以独立于客户端而变化,客户端可以在运行时动态地选择不同的策略来执行相应的算法。
在策略模式中,通常包括以下几个角色:
- Context(上下文): 上下文类持有一个策略对象的引用,它将客户端请求委派给具体的策略对象来执行相应的算法。上下文类通常包含一个可以动态切换策略的方法,以便在运行时选择不同的策略。
Strategy(策略): 策略接口或抽象类定义了一个算法族,其中每个具体的策略类实现了这个接口或继承了这个抽象类。策略类封装了具体的算法实现,客户端通过上下文类调用策略对象的方法来执行算法。
ConcreteStrategy(具体策略): 具体策略类实现了策略接口或抽象类,它包含了具体的算法实现。每个具体策略类实现了一种特定的算法,可以根据具体需求选择不同的具体策略类来执行相应的算法。
策略模式的核心思想是将算法的实现和使用分离,使得算法可以独立变化而不影响客户端代码。通过策略模式,可以更好地组织和管理复杂的算法逻辑,提高代码的灵活性、可维护性和可扩展性。策略模式常用于需要动态地切换算法或根据不同条件选择不同算法的场景。
2. 目的
- 消除大量的条件判断语句: 当代码中存在大量的if-else语句用于根据不同条件执行不同的逻辑时,策略模式可以帮助将不同的条件逻辑封装在不同的策略类中,从而避免代码臃肿和难以维护。
-
提高代码的灵活性和可扩展性: 策略模式使得具体的策略类可以独立变化,客户端可以在运行时动态地选择不同的策略对象,从而实现系统的灵活性和可扩展性。
-
避免代码重复: 将公共部分抽象到策略接口中,具体策略类只需实现自己特有的部分。
-
提高代码的可读性和可维护性: 策略模式将算法的实现细节隐藏在具体策略类中,使得代码结构更清晰,易于理解和维护。
总的来说,策略模式可以帮助解决多个条件判断导致的代码复杂性、提高代码的灵活性和可扩展性,以及避免代码重复,从而提高代码质量和可维护性。
3. 实践
医嘱打印功能,多个打印模板,后续还会增加模板。
针对不同打印模板,进行不同数据处理。
使用策略模式就能很好解决此类问题。
//策略接口
public interface IPrintMethod {List<BiOrderPrint> doPrint(BiOrderPrintSaveBO bo, SysDicItemDTO dicItemDTO);default Map<String, List<BiOrderPrint>> toMap(List<BiOrderPrint> list) {return list.stream().collect(Collectors.groupingBy(BiOrderPrint::getFyFlag));}default List<BiOrderPrint> toList(Map<String, List<BiOrderPrint>> map) {return map.values().stream().flatMap(List::stream).collect(Collectors.toList());}
}//策略实现类1
@Component
@RequiredArgsConstructor
public class PqMethod implements IPrintMethod {private final HandlerOne handlerOne;private final HandlerTwo handlerTwo;private final HandlerThree handlerThree;private final HandlerFour handlerFour;private final HandlerFive handlerFive;private final HandlerLast handlerLast;@Overridepublic List<BiOrderPrint> doPrint(BiOrderPrintSaveBO bo, SysDicItemDTO dicItemDTO) {//1. 数据转换,数据预处理List<BiOrderPrint> biOrderPrintList = handlerOne.doHandler(bo);Map<String, List<BiOrderPrint>> map1 = toMap(biOrderPrintList);//2. 数据填充Map<String, List<BiOrderPrint>> map2 = handlerTwo.doHandler(map1);//3. 根据每页条数,分割部分Map<String, List<BiOrderPrint>> map3 = handlerThree.doHandler(map2, dicItemDTO);//4. 每个分页里面的数据均是小于等于n的,将数据补 全Map<String, List<BiOrderPrint>> map4 = handlerFour.doHandler(map3, dicItemDTO);List<BiOrderPrint> resultList = toList(map4);// 5. 处理特殊数据handlerFive.doHandler(bo);// 6. 报存return handlerLast.doHandler(resultList);}
}//策略实现类2
@Component
@RequiredArgsConstructor
public class SyMethod implements IPrintMethod {private final HandlerOne handlerOne;private final HandlerTwo handlerTwo;private final HandlerLast handlerLast;@Overridepublic List<BiOrderPrint> doPrint(BiOrderPrintSaveBO bo, SysDicItemDTO dicItemDTO) {// 1. 数据转换List<BiOrderPrint> biOrderPrintList = handlerOne.doHandler(bo);// 2. 过滤相同orderId的数据,只保留一份List<BiOrderPrint> list1 = new ArrayList<>(biOrderPrintList.stream().collect(Collectors.toMap(BiOrderPrint::getOrderId,Function.identity(),(existing, replacement) -> existing)).values());// 3. 数据填充Map<String, List<BiOrderPrint>> map1 = toMap(list1);Map<String, List<BiOrderPrint>> map2 = handlerTwo.doHandler(map1);List<BiOrderPrint> resultList = toList(map2);// 4. 报存return handlerLast.doHandler(resultList);}
}//......
//Context(上下文)
@Service
@RequiredArgsConstructor
public class OrderPrintContext {private final List<IPrintMethod> IPrintMethods;public List<BiOrderPrint> doPrint(BiOrderPrintSaveBO bo, SysDicItemDTO dicItemDTO) {//将所有策略实现类放到map里,前端传具体策略Map<String, IPrintMethod> printMethodMap = IPrintMethods.stream().collect(Collectors.toMap(IPrintMethod -> IPrintMethod.getClass().getSimpleName(), Function.identity()));if (ObjectUtil.isNull(dicItemDTO)) {throw new ServiceException(OrderErrorEnum.ERROR_82003, bo.getBillType());}IPrintMethod IPrintMethod = printMethodMap.get(dicItemDTO.getValue3());return IPrintMethod.doPrint(bo, dicItemDTO);}
}
相关文章:
行为型模式(一)策略模式
目录 1. 介绍 2. 目的 3. 实践 1. 介绍 策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,将每种算法封装成具体的策略类,并使它们可以互相替换。策略模式使得算法可以独立于客户端而变化&#x…...
JAVA中的Wrapper类
ava中的Wrapper类,也称为包装类,是Java提供的一组特殊类,它们将基本数据类型(如int、char、double等)封装为对象。这种封装提供了基本数据类型所不具备的功能,如类型转换、序列化、以及在集合(如…...
在没有硬盘的情况下进行电脑数据迁移
电脑数据迁移方式 在更换电脑的时候需要进行文件的传输,但是没有硬盘可以选择使用网线直连或者无线文件共享。通用配置 1.将旧电脑的文件夹或者磁盘设置文件共享 找到指定的文件夹右键属》属性,点击共享》点击高级共享 选择共享文件夹以及修改共享用户…...
C++转Java基础知识
目录 1. Java基础知识 1.1 JDK和JVM 1.2 Java基础代码演示 1.3 Java中的注释 1.4 Java中的关键字 1.5 Java中的println和print的区别 2. Java中的数据类型 2.1 常量 2.2 标识符 2.3 变量 2.4 类型转换 2.5 自动类型转换 2.6 强制类型转换 3. 运算符 3.1 自增运算…...
搭建jenkins一键部署java项目
一、搭建jenkins 链接: https://pan.baidu.com/s/1jzx15PiyI8EhLd_vg7q8bw 提取码: ydhl 复制这段内容后打开百度网盘手机App,操作更方便哦 直接使用docker导入镜像,运行就好 docker run -di --name jenkins -p 8080:8080 -v /home/jenkins_home:/var/je…...
从零到一打造自己的大模型(一)模型实现
前言 最近看了很多大模型,也使用了很多大模型。对于大模型理论似乎很了解,但是好像又缺点什么,思来想去决定自己动手实现一个 toy 级别的模型,在实践中加深对大语言模型的理解。 在这个系列的文章中,我将通过亲手实践…...
【开源项目】基于RTP协议的H264码流发送器和接收器
RTP协议 1. 概述1.1 RTP协议1.2 RTP和UDP的关系 2. RTP打包H264码流2.1 RTP单一传输2.2 RTP分片传输2.3 RTP多片合入传输 3.工程3.1 头文件3.1.1 rtp.h3.1.2 utils.h 3.2 cpp文件3.2.1 rtp.cpp3.2.2 utils.cpp 4.测试5.小结 参考: 视音频数据处理入门:UD…...
【C++】4.类和对象(2)
文章目录 1.类的默认成员函数2.构造函数 1.类的默认成员函数 默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。一个类,我们不写的情况下编译器会默认生成以下6个默认成员函数,需要注意的是这6个中最重要的是前…...
搭建基于树莓派的Linux学习环境(TODO)
主要是想学一下Linux内核,所以搭一套环境,其实有几个选择,好几个都是我买了板子的。 首先是正点原子的RK3568,最早是想弄安卓,但是SDK的大小真的把我劝退了,动不动几百个G的空间,还有就是保底1…...
《大电机技术》是什么级别的期刊?是正规期刊吗?能评职称吗?
问题解答 问:《大电机技术》是不是核心期刊? 答:不是,是知网收录的第一批认定学术期刊。 问:《机电产品开发与创新》级别? 答:省级。主管单位:哈尔滨电气集团公司 主办…...
Python 中使用 Split 忽略逗号
在 Python 中,split 方法可以用于将字符串分割成列表,默认情况下使用空格作为分隔符,但你也可以指定其他分隔符。若想使用 split 方法忽略逗号并按其他分隔符分割字符串,可以使用以下几种方法。 1、问题背景 在 Python 中&#x…...
YOLOv10改进 | 主干篇 | YOLOv10引入CVPR2023 顶会论文BiFormer用于主干修改
1. 使用之前用于注意力的BiFormer在这里用于主干修改。 YOLOv10改进 | 注意力篇 | YOLOv10引入BiFormer注意力机制 2. 核心代码 from collections import OrderedDict from functools import partial from typing import Optional, Union import torch import torch.nn as n…...
sql注入靶场搭建
1.安装小皮面板(PhpStudy) 1.从官网下载:http://www.xp.cn 2、Sqli-labs环境安装 准备好sqli-labs-php7-master文件 3.安装之前确保本地没有下载mysql服务器 如果电脑下载了MySQL可以把MySQL的服务停掉 此电脑>右键>管理>服务…...
【MySQL】MySQL的JSON特性
引言 MySQL从5.7版本开始引入了JSON数据类型,并在8.0版本中大大增强了JSON的支持,包括函数和索引功能。JSON数据类型允许你在MySQL表中存储JSON文档,这些文档可以是对象或数组,并且你可以使用SQL查询来检索、搜索、更新和修改这些…...
微信小程序 - 自定义计数器 - 优化(键盘输入校验)
微信小程序通过自定义组件,实现计数器值的增加、减少、清零、最大最小值限定、禁用等操作。通过按钮事件触发方式,更新计数器的值,并修改相关联的其它变量。通过提升用户体验,对计数器进行优化设计,使用户操作更加便捷…...
Nacos 容器化安装和代理配置指南
简介 Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台。本文将介绍如何使用 Docker 容器化安装 Nacos 以及如何配置 Nacos 的代理。 前提条件 已安装 Docker 和 Docker Compose基本的 Doc…...
css水波浪动画效果
为缩小gif大小,动画效果做了加速,效果如下: <!DOCTYPE html> <html> <head> <style> *{padding:0;margin:0;}/*清除默认填充及边距*/.water{position:relative;width:100vw;height:100vh;overflow:hidden;background…...
SQL二次注入
目录 1.什么是二次注入? 2.二次注入过程 2.1寻找注入点 2.2注册admin#用户 2.3修改密码 1.什么是二次注入? 当用户提交的恶意数据被存入数据库后,因为被过滤函数过滤掉了,所以无法生效,但应用程序在从数据库中拿…...
深入学习小程序开发第二天:数据绑定与动态更新
一、概念 在小程序中,数据绑定是指将页面的数据和视图进行关联,使得数据的变化能够自动反映在视图上,而不需要手动操作DOM。这种绑定是双向的,即数据改变时视图更新,视图操作(如用户输入)也能改变数据。 二、用法 1.单向数据绑定与双向数据绑定: 在小程序中,数据绑定…...
【ai】 时间序列分析的python例子
时间序列分析 :分析和理解随时间变化的数据序列 在gcc的趋势滤波后,需要对排队延迟梯度进行检测及调整,参考的是一个阈值, 调整阈值时就使用了时间序列分析技术: 时间序列分析是统计学和数据分析中的一种技术,用于分析和理解随时间变化的数据序列。时间序列数据具有时间上…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...
react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...
【多线程初阶】单例模式 指令重排序问题
文章目录 1.单例模式1)饿汉模式2)懒汉模式①.单线程版本②.多线程版本 2.分析单例模式里的线程安全问题1)饿汉模式2)懒汉模式懒汉模式是如何出现线程安全问题的 3.解决问题进一步优化加锁导致的执行效率优化预防内存可见性问题 4.解决指令重排序问题 1.单例模式 单例模式确保某…...
