Spring实现策略模式
通过Spring实现策略模式
当程序中使用太多的if/else/switch来处理不同类型的业务时,会变得极难维护,通过策略模式可以更容易的实现业务扩展和维护。
标准策略模式介绍
比如说对象的某个行为,在不同场景中有不同的实现方式,这样就可以将这些实现方式定义为一组策略,每个实现类对应一个策略,在不同的场景就使用不同的实现类,从而实现自由切换策略。
策略模式结构图如下:
模式概述:
策略模式需要定义一个策略接口,不同的策略都去实现策略接口,在需要调用过程中通过持有该策略接口,然后根据不同的场景去使用不同的实现类。
策略模式的优点:
- 消除繁琐的 if、else判断逻辑;
- 代码结构良好,便于阅读;
- 符合开闭原则,扩展性好、便于维护;
策略模式的缺点:
- 策略如果很多的话,会造成策略类臃肿;
- 其他人使用时必须了解所有的策略类及其用途;
spring实现策略模式
举个例子,例如厂家根据订单生产面条,有兰州拉面,刀削面,重庆小面,然后定义一个生产面条的接口,每种面条的生产方法都去实现这个接口,具体实现方式如下:
1、定义策略接口
定义一个策略接口,所有生产面条的接口。
策略接口:
/*** 生产面条接口*/
public interface INoodles {/*** 生产面条* @param order* @return*/Result produce(Order order);}
订单信息类:
/*** 订单信息*/
@Data
public class Order {/*** 面条类型*/private String noodlesType;
}
返回结果类:
/*** 返回结果*/
@Data
@AllArgsConstructor
public class Result {/*** 生产结果*/private String result;
}
2、定义各种策略
定义各种生产策略,兰州拉面、刀削面、重庆小面等面条实现类都实现这个接口。
兰州拉面实现:
/*** 生产兰州拉面*/
@Service("LZNoodles")
public class LZNoodles implements INoodles {@Overridepublic Result produce(Order order) {return new Result("兰州拉面制作完成");}
}
刀削面实现:
/*** 生产刀削面*/
@Service("DXNoodles")
public class DXNoodles implements INoodles {@Overridepublic Result create(Order order) {return new Result("刀削面制作完成");}}
重庆小面实现:
/*** 生产重庆小面*/
@Service("CQNoodles")
public class CQNoodles implements INoodles {@Overridepublic Result create(Order order) {return new Result("重庆小面制作完成");}}
各个面条的实现类通过 @Service 注解生成 Bean 并放入 Spring 容器中,在使用策略的时候就不用 new 对象了。
3、使用策略
标准策略模式使用了枚举、HashMap 的方式来根据策略名称映射策略实现类 ,但是使用了 Spring 框架可以省略这个过程,使用 Bean 名称就能直接找到对应的策略实现类了。
参考示例代码如下:
/*** 生产面条服务*/
@RestController
public class NoodlesService {@Autowiredprivate ApplicationContext applicationContext;/*** 生产面条接口* @param noodlesType* @return*/@RequestMapping("/noodles")public Result produce(@RequestParam("noodlesType") String noodlesType) {Order order = new Order();order.setNoodlesType(noodlesType);// 根据面条类型获取对应的策略INoodles noodles = applicationContext.getBean(order.getNoodlesType(), INoodles.class);// 开始生产面条Result result = noodles.produce(order);return result;}}
在参数中传入实现类在spring容器中的名称,通过Spring提供的ApplicationContext接口可以直接获取注入到spring容器中的对象,然后进行后续的处理即可。
Spring实现策略模式相关推荐
- 如何使用 Spring 实现策略模式+工厂模式
欢迎关注方志朋的博客,回复"666"获面试宝典 一.策略模式 策略模式定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换 1.策略模式主要角色 主要角色如下: 封装角色( ...
- spring AOP策略模式使用
1.策略模式 The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them inte ...
- 原来使用 Spring 实现策略模式可以这么简单!
策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,可以替代代码中大量的 if-else. 比如我们生活中的场景:买东西结账可以使用微信支付.支付宝支付或者银行 ...
- 策略模式及Spring整合策略模式
策略模式 抽象策略类 interface SortService{int[] sort(int arr[]);} 具体策略类 class InsertionSortServiceImpl implem ...
- Spring 中策略模式的 2 个经典应用
点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 转自头条号程序汪汪 背景 程序员在项目实战中,策略模式用的非常多. 学习目标 会在Spring项目中运 ...
- Spring 中策略模式的 2 个经典应用,可以用来怼面试官了
一.背景 程序员在项目实战中,策略模式用的非常多. 二.学习目标 会在Spring项目中运用策略模式 三.代码例子 废话不多说,Java的软件开发们注意啦,开车啦! 下面是一个查询业务使用策略模式的案 ...
- Spring中策略模式实现方法
一.定义 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式.在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而 ...
- java spring 实现策略,Spring 环境下实现策略模式的示例
背景 最近在忙一个需求,大致就是给满足特定条件的用户发营销邮件,但是用户的来源有很多方式:从 ES 查询的.从 csv 导入的.从 MongoDB 查询-.. 需求很简单,但是怎么写的优雅,方便后续扩 ...
- 策略模式、策略模式与Spring的碰撞
策略模式是GoF23种设计模式中比较简单的了,也是常用的设计模式之一,今天我们就来看看策略模式. 实际案例 我工作第三年的时候,重构旅游路线的机票查询模块,旅游路线分为四种情况: 如果A地-B地往返都 ...
最新文章
- antd checkbox 默认选中_antd 开发的一些坑(一)
- java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式
- 关于数组集合之间的转换
- SyntaxError: expected expression, got ''
- php实习生很苦吗,实习生就该被欺负做又累又苦的活吗?!
- 【渝粤教育】电大中专金融与税收作业 题库
- redis sds的申请扩容源码
- AndroidStudio安卓原生开发_UI高级_RecyclerView_循环复用控件_代替ListView_GridView---Android原生开发工作笔记121
- 郑州大学远程教育c语言程序设计答案,郑州大学远程教育C语言考试试卷.doc
- 蓝宝石rx580怎么超频_台式机显卡怎么选?小百科教你准确定位合理选择(3)
- 079 pandas模块
- java继承序列化_Java中具有继承的对象序列化
- apktool java_apktool 简单使用记录
- 花花公子跟风删除Facebook主页,区块链技术可打破互联网垄断
- vue 点击按钮筛选功能_vue实现前端列表多条件筛选
- I2C 连接 12864 OLED 屏幕
- 北京科技大学871计算机真题,(NEW)北京科技大学871计算机综合一(含计算机组成原理、数据结构)历年考研真题汇编(350页)-原创力文档...
- Linux--Smba服务搭建
- 使用xshell连接Ubuntu出现Connecting to 192.168.85.183:22... Could not connect to '192.168.85.183' (port 22)
- eclipse下载及安装
热门文章
- ffmpeg图片转视频以及报Could find no file with path ‘F:\test/%05d.png‘ and index in the range 0-4这样的错误解决方法
- 免费建站平台到底是靠什么盈利
- 32位和62位操作系统
- 钉钉打卡使用H3C AP报错解决办法
- Jenkins mvn 未找到命令
- 公务员转行软件测试,丢掉“铁饭碗”涨薪5K
- linux网络编程函数解析之——setsockopt / getsockopt用法
- VS 2017 添加 ReportViewer
- Linux上网络端口通不通如何测试
- 2小时5台3389肉鸡,国人网络安全意思真差