当前位置: 首页 > news >正文

JAVA策略模式demo【设计模式系列】

策略模式用在统一的入口,但需要根据某个类型判断后续执行逻辑,例如我最近遇到的场景:我需要对接一个设备,前端请求我这边,我再去和设备交互,但设备种类很多,各自有自己的接入规则!传统代码会变成if{}else{}面条代码,而且扩展性不佳,如果后续新增了设备,需要去修改这里的代码,非常不优雅~
闲话少说上代码!

1.创建一个枚举,包含所有策略

public enum StrategyEnums {STRATEGY_ONE("strategyOne", "策略1"),STRATEGY_TWO("strategyTwo", "策略2"),STRATEGY_THREE("strategyThree", "策略3");private String code;private String name;StrategyEnums(String code, String name) {this.code = code;this.name = name;}
}

2.创建一个接口,含执行方法

public interface StrategyService {void run();
}

3.创建3个策略的业务类,实现【StrategyService】接口

public class StrategyServiceImpl1 implements StrategyService{@Overridepublic void run() {System.out.println("运行策略1的业务代码");}
}

4.创建工厂类,用于初始化各策略,提供获取策略的静态方法

public class StrategyFactory {static final Map<StrategyEnums, StrategyService> map = new HashMap<>();static {map.put(StrategyEnums.STRATEGY_ONE, new StrategyServiceImpl1());map.put(StrategyEnums.STRATEGY_TWO, new StrategyServiceImpl2());map.put(StrategyEnums.STRATEGY_THREE, new StrategyServiceImpl3());}public static StrategyService getStrategy(StrategyEnums strategyEnums) {return map.get(strategyEnums);}
}

5.创建控制器,对前端提供接口【可选】

@RestController("design")
public class DesignController {@GetMapping("strategy")public void strategyTest(StrategyEnums strategyEnums) {StrategyService strategy = StrategyFactory.getStrategy(strategyEnums);strategy.run();}
}

6.创建测试类,调用接口【可选】

@SpringBootTest
public class DesignTest {@AutowiredDesignController designController;/*** 策略模式测试*/@Testpublic void strategyTest() {designController.strategyTest(StrategyEnums.STRATEGY_ONE);designController.strategyTest(StrategyEnums.STRATEGY_TWO);designController.strategyTest(StrategyEnums.STRATEGY_THREE);}
}

为了方便演示,我是从测试方法里调用的接口,实际上可以用postman走接口执行,或在测试类里使用工厂直接调用。下面查看执行结果:
在这里插入图片描述
假设后续新增一个需要对接的设备,我只需要在枚举增加一个类型,在工厂里初始化,然后创建一个新的策略,完成业务代码即可,优雅!实在是优雅~
在这里插入图片描述

http://www.lryc.cn/news/583541.html

相关文章:

  • LaCo: Large Language Model Pruning via Layer Collapse
  • Java 大视界 -- 基于 Java 的大数据分布式计算在生物信息学蛋白质 - 蛋白质相互作用预测中的应用(340)
  • windows指定某node及npm版本下载
  • Using Spring for Apache Pulsar:Message Production
  • Softmax函数的学习
  • 矩阵之方阵与行列式的关系
  • Flink-1.19.0源码详解6-JobGraph生成-后篇
  • Android Soundtrigger唤醒相关时序学习梳理
  • 常见 HTTP 方法的成功状态码200,204,202,201
  • C++并发编程-11. C++ 原子操作和内存模型
  • Token 和 Embedding的关系
  • 通过Tcl脚本命令:set_param labtools.auto_update_hardware 0
  • AI Agent:我的第一个Agent项目
  • 在 macOS 上安装与自定义 Oh My Zsh:让终端美观又高效 [特殊字符]
  • css支持if else
  • WIndows 编程辅助技能:格式工厂的使用
  • 单片机STM32F103:DMA的原理以及应用
  • React面试高频考点解析
  • 【LeetCode 热题 100】21. 合并两个有序链表——(解法二)递归法
  • Spark流水线数据对比组件
  • 第6章应用题
  • 01-elasticsearch-搭个简单的window服务-ik分词器-简单使用
  • 【01】MFC入门到精通—— MFC新建基于对话框的项目 介绍(工作界面、资源视图 、类视图)
  • 【前端】ikun-markdown: 纯js实现markdown到富文本html的转换库
  • Java SE 实现简单的图书管理系统(完善菜单操作)
  • 【DOCKER】-3 数据持久化
  • 项目进度受制于资源分配,如何动态调配资源
  • 20250709: WSL+Pycharm 搭建 Python 开发环境
  • PHP 基于模板动态生成 Word 文档:图片 + 表格数据填充全方案(PHPOffice 实战)
  • 爬虫-数据解析