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

策略工厂模式

  • 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://xiahunao.cn/news/3279851.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

第三周:网络应用(上)

一、网络应用&#xff08;层&#xff09;内容概述 我们已经知道&#xff0c;Internet的体系结构是符合TCP/IP协议栈的&#xff0c;而“应用层”就在这个协议的最上层。 本讲内容包括&#xff1a; 二、网络应用的基本原理 常见网络应用包括&#xff1a; 问&#xff1a;网络应…

【机器学习】正规方程的简单介绍以及如何使用Scikit-Learn实现基于正规方程的闭式解线性回归

引言 Scikit-learn 是一个开源的机器学习库&#xff0c;它支持 Python 编程语言。它提供了多种机器学习算法的实现&#xff0c;并用于数据挖掘和数据分析 文章目录 引言一、正规方程的定义二、正规方程的原理三、使用 Scikit-Learn 实现基于正规方程的闭式解线性回归3.1 工具3.…

如何使用rdma-core来实现RDMA操作

rdma-core 是一个开源项目&#xff0c;为远程直接内存访问&#xff08;RDMA&#xff09;提供用户空间的支持。它包括 RDMA 设备的驱动程序、库和工具&#xff0c;旨在简化 RDMA 应用的开发和部署。 基础知识参考博文&#xff1a; 一文带你了解什么是RDMA RDMA 高性能架构基本…

“论数据分片技术及其应用”写作框架软考高级论文系统架构设计师论文

论文真题 数据分片就是按照一定的规则&#xff0c;将数据集划分成相互独立、正交的数据子集&#xff0c;然后将数据子集分布到不同的节点上。通过设计合理的数据分片规则&#xff0c;可将系统中的数据分布在不同的物理数据库中&#xff0c;达到提升应用系统数据处理速度的目的…

快速入门 Spring Security

1 认证授权 认证&#xff08;Authentication&#xff09;&#xff1a;可以理解为登录&#xff0c;验证访问者的身份。包括用户名密码认证、手机号短信验证码认证、指纹识别认证、面容识别认证等等授权&#xff08;Authorization&#xff09;&#xff1a;授权发生在系统完成身份…

springboot校园商店配送系统-计算机毕业设计源码68448

摘要 本文详细阐述了基于Spring Boot框架的校园商店配送系统的设计与实现过程。该系统针对校园内的用户需求&#xff0c;整合了用户注册与登录、商品浏览与购买、订单管理、配送追踪、用户反馈收集以及后台管理等功能&#xff0c;为校园内的普通用户、商家、配送员和管理员提供…

用深度学习改进乳腺癌MRI诊断| 文献速递--AI辅助的放射影像疾病诊断

Title 题目 Improving breast cancer diagnostics with deep learning for MRI 用深度学习改进乳腺癌MRI诊断 01 文献速递介绍 乳腺磁共振成像&#xff08;MRI&#xff09;是一种检测乳腺癌的高度敏感的方式&#xff0c;报告的敏感性超过80%。传统上&#xff0c;其在筛查…

教程系列4 | 趋动云『社区项目』极速体验 LivePortrait 人脸表情“移花接木”大法

LivePortrait LivePortrait 由快手可灵大模型团队开源&#xff0c;只需 1 张原图就能生成动态视频。 LivePortrait 的核心优势在于其卓越的表情"迁移"技术&#xff0c;能够令静态图像中的人物瞬间焕发活力&#xff0c;无论是眨眼、微笑还是转头&#xff0c;皆栩栩如…

spaCy语言模型下载

spaCy 是一个基于 Python 编写的开源自然语言处理&#xff08;NLP&#xff09;库&#xff0c;它提供了一系列的工具和功能&#xff0c;用于文本预处理、文本解析、命名实体识别、词性标注、句法分析和文本分类等任务。 spaCy支持多种语言模型对文本进行处理&#xff0c;包括中文…

JAVA基础 - 异常处理

目录 一. 简介 二. 受检异常 三. 非受检异常 四. 自定义异常类 一. 简介 异常处理是 Java 编程中的一个重要概念&#xff0c;它用于处理程序运行时可能出现的不正常情况。 在 Java 中&#xff0c;异常可以分为两类&#xff1a;受检异常&#xff08;Checked Exception&…

一篇长文搭建AI大模型应用平台架构

在研究了6家知名公司如何部署生成式AI应用程序后&#xff0c;注意到它们的平台有很多相似之处。概述了生成式AI大模型应用平台的常见组件、它们的作用以及它们的实现方式。尽力保持架构的通用性&#xff0c;但某些应用程序可能会有所不同。 Generative AI大模型应用平台整体架…

【Vulnhub系列】Vulnhub_pipe 靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub-pipe 靶场渗透 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、环境配置 1、解决IP扫描不到问题 2、打开虚拟机&#xff0c;并修改网络连接模式为【NAT】即可 二、信息收集 1…

树状机器学习模型综述(含python代码)

树状机器学习模型综述 树状模型是机器学习中一种非常重要的算法类别&#xff0c;因其直观的结构和良好的可解释性而广泛应用于分类和回归任务。本文将综述几种常见的树状模型&#xff0c;包括决策树、随机森林、LightGBM、XGBoost和CatBoost&#xff0c;讨论它们的原理、用途以…

自适应降噪与沉浸音效的结合,戴上QCY MeloBuds Pro,开启静谧音乐之旅

现在蓝牙耳机的选择真是太丰富了&#xff0c;其中性价比高的还是国产品牌&#xff0c;我之前用过几款QCY的耳机&#xff0c;感觉不管是设计&#xff0c;还是音质&#xff0c;以及佩戴的舒适度&#xff0c;都要比同价位的耳机更出色一些。最近我又新入手了一款 MeloBuds Pro&…

【QT 5-控件对比-小技巧-控件显示文字和更改文字-label控件-lineEdit控件-记录】

【QT 5-控件对比-小技巧-控件显示文字和更改文字-label控件-lineEdit控件-记录】 1、前言2、环境3、控件说明&#xff08;1&#xff09;QLabel&#xff08;2&#xff09;QLineEdit 4、控件代码说明&#xff08;1&#xff09;第一种控件 QLabel1-UI文件上编写2-代码控制3-完全代…

java实现加水印功能

1-Word加水印 实现原理&#xff1a; ● 通过页眉页脚生成文字水印或图片水印&#xff0c;然后设置页眉页脚的高度以及旋转角度来设置水印。 源代码&#xff1a; 1、引入pom依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml…

在linux编译JsonCpp 1.9.5

编译方法 mkdir jsoncpp-Sandbox ; cd jsoncpp-Sandbox git clone https://github.com/open-source-parsers/jsoncpp.git mkdir jsoncpp-build mkdir jsoncpp-install cd ./jsoncpp-build/ cmake ../jsoncpp/ -DCMAKE_INSTALL_PREFIX/home/vis/work/SourceCode/jsoncpp-Sandbo…

智能体一键生成个性化贺卡

文章目录 一、前言二、创建智能体编辑名称头像简介人物设定开场白引导示例高级配置调试发布 三、总结 一、前言 欢迎来到节日的温馨角落&#xff01;我是您的节日贺卡助手&#xff0c;专为您打造独一无二的节日祝福。无论是温馨的问候&#xff0c;还是创意的惊喜&#xff0c;我…

【Threejs进阶教程-着色器篇】5. 2D SDF(二)圆形波纹效果

2D SDF 圆形波纹效果 关于本Shader教程前四篇地址&#xff0c;请按顺序学习本博客使用模板代码中的Shader模板绘制第一圈波纹绘制多圈波纹fract函数 让光波动起来使用uniform控制最终效果追加uniform&#xff0c;以及lil.gui控制器修改片元着色器最终效果 完整源码 关于本Shad…

leetcode日记(63)颜色分类

感觉就是排序问题&#xff1f;我使用的是时间复杂度比较高的简单粗暴排序法&#xff0c;时间复杂度O&#xff08;n^2&#xff09;。 class Solution { public:void sortColors(vector<int>& nums) {int nnums.size();for(int i0;i<n;i){for(int ji1;j<n;j){if…