通过Spring实现策略模式

当程序中使用太多的if/else/switch来处理不同类型的业务时,会变得极难维护,通过策略模式可以更容易的实现业务扩展和维护。

标准策略模式介绍

比如说对象的某个行为,在不同场景中有不同的实现方式,这样就可以将这些实现方式定义为一组策略,每个实现类对应一个策略,在不同的场景就使用不同的实现类,从而实现自由切换策略。
策略模式结构图如下:

模式概述:
策略模式需要定义一个策略接口,不同的策略都去实现策略接口,在需要调用过程中通过持有该策略接口,然后根据不同的场景去使用不同的实现类。

策略模式的优点:

  1. 消除繁琐的 if、else判断逻辑;
  2. 代码结构良好,便于阅读;
  3. 符合开闭原则,扩展性好、便于维护;

策略模式的缺点:

  1. 策略如果很多的话,会造成策略类臃肿;
  2. 其他人使用时必须了解所有的策略类及其用途;

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实现策略模式相关推荐

  1. 如何使用 Spring 实现策略模式+工厂模式

    欢迎关注方志朋的博客,回复"666"获面试宝典 一.策略模式 策略模式定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换 1.策略模式主要角色 主要角色如下: 封装角色( ...

  2. spring AOP策略模式使用

    1.策略模式 The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them inte ...

  3. 原来使用 Spring 实现策略模式可以这么简单!

    策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,可以替代代码中大量的 if-else. 比如我们生活中的场景:买东西结账可以使用微信支付.支付宝支付或者银行 ...

  4. 策略模式及Spring整合策略模式

    策略模式 抽象策略类 interface SortService{int[] sort(int arr[]);} 具体策略类 class InsertionSortServiceImpl implem ...

  5. Spring 中策略模式的 2 个经典应用

    点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 转自头条号程序汪汪 背景 程序员在项目实战中,策略模式用的非常多. 学习目标 会在Spring项目中运 ...

  6. Spring 中策略模式的 2 个经典应用,可以用来怼面试官了

    一.背景 程序员在项目实战中,策略模式用的非常多. 二.学习目标 会在Spring项目中运用策略模式 三.代码例子 废话不多说,Java的软件开发们注意啦,开车啦! 下面是一个查询业务使用策略模式的案 ...

  7. Spring中策略模式实现方法

    一.定义 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式.在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而 ...

  8. java spring 实现策略,Spring 环境下实现策略模式的示例

    背景 最近在忙一个需求,大致就是给满足特定条件的用户发营销邮件,但是用户的来源有很多方式:从 ES 查询的.从 csv 导入的.从 MongoDB 查询-.. 需求很简单,但是怎么写的优雅,方便后续扩 ...

  9. 策略模式、策略模式与Spring的碰撞

    策略模式是GoF23种设计模式中比较简单的了,也是常用的设计模式之一,今天我们就来看看策略模式. 实际案例 我工作第三年的时候,重构旅游路线的机票查询模块,旅游路线分为四种情况: 如果A地-B地往返都 ...

最新文章

  1. antd checkbox 默认选中_antd 开发的一些坑(一)
  2. java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式
  3. 关于数组集合之间的转换
  4. SyntaxError: expected expression, got ''
  5. php实习生很苦吗,实习生就该被欺负做又累又苦的活吗?!
  6. 【渝粤教育】电大中专金融与税收作业 题库
  7. redis sds的申请扩容源码
  8. AndroidStudio安卓原生开发_UI高级_RecyclerView_循环复用控件_代替ListView_GridView---Android原生开发工作笔记121
  9. 郑州大学远程教育c语言程序设计答案,郑州大学远程教育C语言考试试卷.doc
  10. 蓝宝石rx580怎么超频_台式机显卡怎么选?小百科教你准确定位合理选择(3)
  11. 079 pandas模块
  12. java继承序列化_Java中具有继承的对象序列化
  13. apktool java_apktool 简单使用记录
  14. 花花公子跟风删除Facebook主页,区块链技术可打破互联网垄断
  15. vue 点击按钮筛选功能_vue实现前端列表多条件筛选
  16. I2C 连接 12864 OLED 屏幕
  17. 北京科技大学871计算机真题,(NEW)北京科技大学871计算机综合一(含计算机组成原理、数据结构)历年考研真题汇编(350页)-原创力文档...
  18. Linux--Smba服务搭建
  19. 使用xshell连接Ubuntu出现Connecting to 192.168.85.183:22... Could not connect to '192.168.85.183' (port 22)
  20. eclipse下载及安装

热门文章

  1. ffmpeg图片转视频以及报Could find no file with path ‘F:\test/%05d.png‘ and index in the range 0-4这样的错误解决方法
  2. 免费建站平台到底是靠什么盈利
  3. 32位和62位操作系统
  4. 钉钉打卡使用H3C AP报错解决办法
  5. Jenkins mvn 未找到命令
  6. 公务员转行软件测试,丢掉“铁饭碗”涨薪5K
  7. linux网络编程函数解析之——setsockopt / getsockopt用法
  8. VS 2017 添加 ReportViewer
  9. Linux上网络端口通不通如何测试
  10. 2小时5台3389肉鸡,国人网络安全意思真差