JAVA笔记 | 实际上用到的策略模式(可直接套用)

news/2024/10/22 13:50:43/

自己开发中用到了策略模式,这样写不一定是最好的,但是满足了业务场景跟使用要求,做个笔记,下次有用到可以快速复习跟套用

假设使用场景:有几只宠物,猫跟狗等,要求他们做各种动作,比如叫,跑等,但是作为宠物这些都是相同的动作,只是猫,狗具体的表现不同,比如猫叫是喵,狗叫是汪

1.创建基础策略接口PetStrategy

java">public interface PetStrategy {//类型 cat-猫,dog-狗String getType();//执行动作 1 - 叫barkString bark();//执行动作 2 - 跑RUN 带参数例子String run(String name);
}

2.创建实现PetStrategy接口的猫CatStrategy跟狗DogStrategy用于实现具体的表现

注意加上@Service

java">//猫实现类
@Service
public class CatStrategy implements PetStrategy{@Overridepublic String getType() {return "cat";}@Overridepublic String bark() {return "猫叫喵喵喵";}@Overridepublic String run(String name) {return name + "猫跑了";}
}//狗实现类
@Service
public class DogStrategy implements PetStrategy{@Overridepublic String getType() {return "dog";}@Overridepublic String bark() {return "狗叫汪汪汪";}@Overridepublic String run(String name) {return name + "狗跑了";}
}

3.创建统一策略入口,即不同宠物类型type进来进行分配对应的策略

java">public interface PetStrategyHandler {//宠物叫行为String bark(String type);//宠物跑行为-带入参String run(String type,String name);
}

4.创建入口配置类,接收入口传来的type,用于实际分配不同的策略,类似工厂

java">@Configuration
public class PetStrategyConfig {@Beanpublic PetStrategyHandler petHandler(List<PetStrategy> strategies) {Map<String, PetStrategy> strategyMap = strategies.stream().collect(Collectors.toMap(PetStrategy::getType, item -> item));PetStrategyHandler handler = new PetStrategyHandler() {@Overridepublic String bark(String type) {return strategyMap.get(type).bark();}@Overridepublic String run(String type,String name) {return strategyMap.get(type).run(name);}};return handler;}
}

 5.创建controller测试

java">@RestController
@RequestMapping("/pet")
public class PetController {@Resourceprivate PetStrategyHandler handler;@GetMapping("/bark/{type}")public String bark(@PathVariable String type){return this.handler.bark(type);}@GetMapping("/run/{type}")public String run(@PathVariable String type,@RequestParam String name){return this.handler.run(type,name);}
}

这样后续如果有新的动物,只需增加新的xxStrategy跟传对应type就好,策略模式替换if的好处不是百分百的,具体看实现要求吧,各有优缺点


http://www.ppmy.cn/news/1533270.html

相关文章

服装分类检测系统源码分享

服装分类检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

国内访问OpenAI API

最近在学习LLM。绕不过去的肯定要学习OpenAI。 国内想直接使用官方API十分麻烦。就到处查资料及网友的分享。发现了这个代理可以在国内很方便的使用OpenAI API。 代理的地址如下&#xff1a; https://referer.shadowai.xyz/r/1014150 经过一段实际体验下来&#xff0c;这个…

leetcode刷题day31|贪心算法Part05重叠区间问题(56. 合并区间、738.单调递增的数字、968.监控二叉树)

56. 合并区间 思路&#xff1a;这个题跟气球重叠区间的题目类似&#xff0c;只需要先按左边界进行排序&#xff0c;判断是否重叠&#xff0c;如果重叠&#xff0c;就选择最小的左边界和最大的右边界构成新的区间。 代码如下&#xff1a; class Solution {public int[][] mer…

选择更轻松:山海鲸可视化与PowerBI的深度对比

在数据分析与可视化的时代&#xff0c;选择合适的报表工具显得尤为重要。山海鲸可视化和PowerBI是市场上颇受欢迎的两款免费报表软件&#xff0c;各有特色。接下来&#xff0c;我们将从功能、优缺点等方面进行对比&#xff0c;帮助你找到最适合的工具。 山海鲸可视化 山海鲸可…

QEMU使用Qemu-Guest-Agent传输文件、执行指令等

简介 之前介绍过qemu传输文件&#xff0c;使用的挂载 / samba方式 &#xff1a;Qemu和宿主机不使用外网进行文件传输。 这是一种方式&#xff0c;这里还有另一种方式&#xff1a;使用Qemu-Guest-Agent&#xff0c;后面简称qga。 官网介绍&#xff1a;https://www.qemu.org/d…

超分服务的分量保存

分量说明 分量的概念主要是对于显卡解码&#xff0c;编码和网络传输而言&#xff0c;显卡可以同时进行几个线程&#xff0c;多个显卡可以分布式计算&#xff0c;对分量进行AI识别&#xff0c;比如我们有cuda的显卡&#xff0c;cuda的核心量可以分给不同的分片视频&#xff0c;第…

Linux 进程的基本概念及描述

目录 0.前言 1. 什么是进程 1.1 进程的定义与特性 1.2 进程与线程的区别 2.描述进程 2.1 PCB (进程控制块) 2.2 task_struct 3.查看进程 3.1 查看进程信息 3.1.1 /proc 文件系统 3.1.2 ps 命令 3.1.2 top 和 htop 命令 3.2 获取进程标识符 3.2.1使用命令获取PID 3.2.2 使用C语言…

书生大模型实战训练营 第三期 入门岛

1.Linux 任务一 完成SSH连接与端口映射并运行hello_world.py vscode自带的端口设置功能很方便 2.Python 任务一 实现wordcount函数 任务二 vscode 单步调试