【策略工厂模式】记录策略工厂模式简单实现

策略工厂模式

  • 1. 需求背景
  • 2. 代码实现
    • 2.1 定义基类接口
    • 2.2 排序策略接口定义
    • 2.3 定义抽象类,实现策略接口
    • 2.4 具体的排序策略实现类
    • 2.5 实现策略工厂类
    • 2.6 控制类
  • 3. 启动测试
  • 4. 总结

1. 需求背景

现在需要你创建一个策略工厂类,来根据策略实现各种排序功能

2. 代码实现

2.1 定义基类接口

首先定义基类接口BaseStrategy ,获取策略名称

public interface BaseStrategy {/*** 获取策略名称*/String getStrategyName();
}

2.2 排序策略接口定义

其次,定义排序策略接口 SortStrategy

public interface SortStrategy extends BaseStrategy {/*** 对数组进行排序* @param array 待排序的数组*/void sort(int[] array);
}

2.3 定义抽象类,实现策略接口

定义一个抽象类 AbstractSortStrategy,它实现了部分 SortStrategy 接口的功能,并留出 sort 方法需要被具体策略实现类实现

@Service
@Slf4j
public abstract class AbstractSortStrategy implements SortStrategy {@Overridepublic abstract void sort(int[] array);@Overridepublic abstract String getStrategyName();protected void printStrategyUsed() {log.info("使用 " + getStrategyName() + " 排序策略对数组排序");}
}

2.4 具体的排序策略实现类

实现四种不同的排序算法作为具体策略:

冒泡排序:

@Component
public class BubbleSortStrategy extends AbstractSortStrategy {@Overridepublic void sort(int[] array) {int n = array.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (array[j] > array[j + 1]) {// 交换 array[j] 和 array[j + 1]int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;}}}printStrategyUsed();}@Overridepublic String getStrategyName() {return "冒泡排序";}
}

插入排序:

@Component
public class InsertionSortStrategy extends AbstractSortStrategy {@Overridepublic void sort(int[] array) {int n = array.length;for (int i = 1; i < n; i++) {int key = array[i];int j = i - 1;while (j >= 0 && array[j] > key) {array[j + 1] = array[j];j--;}array[j + 1] = key;}printStrategyUsed();}@Overridepublic String getStrategyName() {return "插入排序";}
}

快速排序:

@Component
public class QuickSortStrategy extends AbstractSortStrategy {@Overridepublic void sort(int[] array) {quickSort(array, 0, array.length - 1);printStrategyUsed();}private void quickSort(int[] array, int low, int high) {if (low < high) {int pi = partition(array, low, high);quickSort(array, low, pi - 1);quickSort(array, pi + 1, high);}}private int partition(int[] array, int low, int high) {int pivot = array[high];int i = low - 1;for (int j = low; j < high; j++) {if (array[j] < pivot) {i++;int temp = array[i];array[i] = array[j];array[j] = temp;}}int temp = array[i + 1];array[i + 1] = array[high];array[high] = temp;return i + 1;}@Overridepublic String getStrategyName() {return "快速排序";}
}

选择排序:

@Component
public class SelectionSortStrategy extends AbstractSortStrategy {@Overridepublic void sort(int[] array) {int n = array.length;for (int i = 0; i < n - 1; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if (array[j] < array[minIndex]) {minIndex = j;}}// 交换 array[i] 和 array[minIndex]int temp = array[i];array[i] = array[minIndex];array[minIndex] = temp;}printStrategyUsed();}@Overridepublic String getStrategyName() {return "选择排序";}
}

2.5 实现策略工厂类

实现策略工厂类 SearchStrategyFactory,用于管理和获取不同策略的实例:

@Component
@Slf4j
public class SortStrategyFactory implements ApplicationContextAware {private static Map<String, SortStrategy> strategyMap = new HashMap<>();@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {Map<String, SortStrategy> map = applicationContext.getBeansOfType(SortStrategy.class);log.info("初始化排序策略工厂,共找到 {} 个排序策略:", map.size());map.forEach((key, value) -> {strategyMap.put(value.getStrategyName(), value);log.info("策略名称:{},策略类:{}", key, value.getClass().getSimpleName());});}public <T extends SortStrategy> T getStrategy(String strategyName) {SortStrategy strategy = strategyMap.get(strategyName);if (strategy == null) {log.error("获取策略失败,策略名称:{}",strategyName);throw new BaseException(CommonErrorEnum.SYSTEM_ERROR);}return (T) strategy;}
}

2.6 控制类

@RestController
@RequestMapping("/sort")
@Slf4j
public class SortController {@Autowiredprivate SortStrategyFactory strategyFactory;@GetMapping("/array")public ResponseEntity<Map<String,String>> sortArray(@RequestParam String strategyName, @RequestParam int[] array) {Map<String,String> result = new HashMap<>();SortStrategy strategy = strategyFactory.getStrategy(strategyName);strategy.sort(array);// 返回排序后的数组String sortedArray = Arrays.toString(array);log.info("排序后的数组:{}", sortedArray);result.put("排序结果", sortedArray);result.put("排序策略", strategy.getStrategyName());return ResponseEntity.ok(result);}
}

项目完整目录结构

在这里插入图片描述

3. 启动测试

请求接口:

在这里插入图片描述

运行代码,打断点,结果如下:

在这里插入图片描述
结果如下:

在这里插入图片描述

4. 总结

ApplicationContextAware 接口实现SortStrategyFactory 类实现了ApplicationContextAware 接口,并重写了 setApplicationContext 方法。在这个方法中,它获取了所有类型为 SortStrategy 的 Bean,并将它们存储在 strategyMap 中,以策略名称作为键,策略实例作为值。

getStrategy 方法getStrategy 方法用于根据传入的策略名称 strategyName,从 strategyMap 中获取对应的策略实例。如果找不到对应的策略实例,则记录错误日志并抛出 BaseException 异常。

代码:GitHub

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/386898.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA】记录一次前端无能造成的 线上bug

有一个需求是 当方式切换 垫资时 清空 当前所选细单商品 但是前端的奇葩 操作是&#xff0c;只是在页面上清空 细单。 不请求 后台删除 细单 让前端 必须 清空同时 请求后台 删除细单 但是 该前端 技术不行&#xff0c; 嫌麻烦 不做 只好 后台 判断该类型时 进行删除操作…

AutoMQ 开源可观测性方案:夜莺 Flashcat

01 引言 在现代企业中&#xff0c;随着数据处理需求的不断增长&#xff0c;AutoMQ [1] 作为一种高效、低成本的流处理系统&#xff0c;逐渐成为企业实时数据处理的关键组件。然而&#xff0c;随着集群规模的扩大和业务复杂性的增加&#xff0c;确保 AutoMQ 集群的稳定性、高可…

权限管理的概述以及vue开发前端的路由、菜单、按钮权限控制实现方案

1. 权限管理概念 1.1 权限定义 权限管理是确保用户只能访问被授权资源的机制。在计算机系统中&#xff0c;权限通常指对特定数据或功能的访问权。权限的设置和控制对于保护数据安全和系统安全至关重要。 1.2 前端权限控制重要性 前端权限控制是用户与应用交互的第一道防线。…

黑马头条Day12-项目部署_持续集成

一、今日内容介绍 1. 什么是持续集成 持续集成&#xff08;Continuous integration&#xff0c;简称CI&#xff09;&#xff0c;指的是频繁地&#xff08;一天多次&#xff09;将代码集成到主干。 持续集成的组成要素&#xff1a; 一个自动构建过程&#xff0c;从检出代码、…

jdk版本管理利器-sdkman

1.什么是sdkman&#xff1f; sdkman是一个轻量级、支持多平台的开源开发工具管理器&#xff0c;可以通过它安装任意主流发行版本&#xff08;例如OpenJDK、Kona、GraalVM等等&#xff09;的任意版本的JDK。通过下面的命令可以轻易安装sdkman: 2.安装 curl -s "https://…

什么是 5G?

什么是 5G&#xff1f; 5G 是第五代无线蜂窝技术&#xff0c;与以前的网络相比&#xff0c;它提供了更高的上传和下载速度、更一致的连接以及更高的容量。5G 比目前流行的 4G 网络更快、更可靠&#xff0c;并有可能改变我们使用互联网访问应用程序、社交网络和信息的方式。例如…

通过 WSL 2 在Windows 上挂载 Linux 磁盘

原文查看 曾为了传输或者共享不同系统的文件频繁地在 Windows 和 Linux 系统之间切换&#xff0c;效率过低&#xff0c;所以尝试通过 WSL 2 在Windows 上挂载 Linux 磁盘。 先决条件 需要在Windows 10 2004 及更高版本&#xff08;Build 19041 及更高版本&#xff09;或 Win…

Redis 缓存

安装 安装 Redis 下载&#xff1a; Releases tporadowski/redis (github.com) winr ----services.msc-----将redis 设置为手动(只是学习&#xff0c;如果经常用可以设置为自动) 安装 redis-py 库 pip install redis-py Redis 和 StrictRedis redis-py 提供 Redis 和 Str…

UDP通信 单播,广播,组播

UDP通信实现 #include <sys/types.h> #include <sys/socket.h> ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); - 参数&#xff1a; struct sockaddr *src_addr, socklen_t *addrlen…

vue基础3

1.推荐好用的第三方框架 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 1.moment.js 2.dayjs 2.收集表达数据 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Document</title><…

MyBatis-Plus自动生成代码

目录 前言一. 什么是 MyBatis-Plus1. Mybatis-Plus 的特点2. Mybatis-Plus 结构二. MyBatis-Plus 自动生成步骤1. 数据库准备2. 环境准备(1) 创建一个空的 Spring Boot 工程(2) 导入pom依赖(3) 编辑application.yml文件(4) 在启动类加入 @MapperScan 注解3. 配置代码4. 运行三.…

数据库安全:MySQL安全配置,MySQL安全基线检查加固

「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 这一章节我们需要知道MySQL的安全基线标准和加固方式。 MySQL基线检查 1、更新…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 围棋的气(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

unity3d:TabView,UGUI多标签页组件,TreeView树状展开菜单

概述 1.最外层DataForm为空壳编辑数据用。可以有多个DataForm&#xff0c;例如福利DataForm&#xff0c;抽奖DataForm 2.Menu层为左边栏层&#xff0c;每个DataForm可以使用不同样式的MenuForm预制体 3.DataForm中使用ReorderList&#xff0c;可排列配置 4.有定位功能&#xf…

stl-set

目录 目录 内部自动有序、不含重复元素 关于能不能自己造一个cmp&#xff0c;还挺复杂。 访问&#xff1a;只能用迭代器且受限 添加元素&#xff1a;没有pushback&#xff0c;用insert 复杂度&#xff1a;ologn ​编辑 查找元素find&#xff08;&#xff09;&#xff1…

C++-入门(下)

一、前言&#xff1a; 目标&#xff1a; 1. C 关键字 2. 命名空间 3. C 输入 & 输出 4. 缺省参数 5. 函数重载 6. 引用 7. 内联函数 8. auto 关键字 (C11) 9. 基于范围的 for 循环 (C11) 10. 指针空值 ---nullptr(C11) 二、目标的实现&#xff1a; 6. 引用&#xff1a;…

后端开发工程师vue2初识的学习

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;JavaWeb关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 什么是Vue&#xff1f; Vue &#xff08;通常指 Vue.js&#xff09;是一个用…

Mybatis批量更新数据库错误

问题&#xff1a;记录一次使用Mybatis批量更新数据库的错误&#xff0c;错误信息&#xff0c;Error updating database. Cause: org.postgresql.util.PSQLException: 错误: 字段 "update_time" 的类型为 timestamp without time zone, 但表达式的类型为 text 建议&am…

【Unity动画】Animation Sequencer:动画制作的革新工具

在Unity游戏开发中&#xff0c;动画是提升玩家体验的关键因素。传统的动画制作方式往往耗时且复杂&#xff0c;但有了Animation Sequencer&#xff0c;这一过程将变得更加直观和高效。本文将介绍Animation Sequencer这一视觉工具&#xff0c;探讨其如何帮助开发者在Unity编辑器…

Ubuntu 20.04.6 安装 Elasticsearch

1.准备 -- 系统更新 sudo apt update sudo apt upgrade -- 安装vim 文本编辑器 sudo apt install vim-- jdk 版本确认 java -versionjdk 安装可以参照&#xff1a;https://blog.csdn.net/CsethCRM/article/details/140768670 2.官方下载Elasticsearch 官方地址&#xff1a;h…