策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

  传统的策略模式一般是创建公共接口、定义公共方法——》然后创建实体类实现公共接口、根据各自的逻辑重写公共方法——》创建一个行为随着策略对象改变而改变的 context 对象——》根据不同的传参,调用不同的接口实现类方法,达到只改变参数即可获得不同结果的目的。

  但是也可以明显发现,这种策略模式的实现方式,代码量较大,而且还要自定义要传递的参数,可能会引入一定数量的if/else,有一定的优化空间,接下来,我会结合实际开发经验,分享一种策略模式的优化方式,进一步优化代码结构、减少代码量。

  首先,必不可少的需要创建公共接口、定义公共方法,然后创建实体类实现公共接口、根据各自的逻辑重写公共方法,参考代码如下:

定义公共接口CommonService,以及公共方法push()

1 package com.itcq.service.StrategyPattern;
2
3 public interface CommonService {
4 String push(String key);
5 }

创建三个不同的接口实现类,重写push()方法

 1 package com.itcq.service.StrategyPattern;
2 import org.springframework.stereotype.Service;
3
4 @Service
5 public class TestOne implements CommonService {
6 @Override
7 public String push(String key) {
8 return "1.这是模式:" + key;
9 }
10 }
 1 package com.itcq.service.StrategyPattern;
2
3 import org.springframework.stereotype.Service;
4
5 @Service
6 public class TestTwo implements CommonService{
7 @Override
8 public String push(String key) {
9 return "2.这是模式:"+key;
10 }
11 }
 1 package com.itcq.service.StrategyPattern;
2 import org.springframework.stereotype.Service;
3
4 @Service
5 public class TestThree implements CommonService{
6 @Override
7 public String push(String key) {
8 return "3.这是模式:"+key;
9 }
10 }

接下来就是重点,我们利用到springboot初始化Bean的方式结合HashMap,来实现对策略模式的优化

 1 @Service
2 public class TestServiceTwo implements InitializingBean {
3
4 @Autowired
5 private ApplicationContext applicationContext;
6
7 private HashMap<String, CommonService> hashmap = new HashMap<>();
8
9 @Override
10 public void afterPropertiesSet() {
11
12 hashmap.put(StrategyTestEnum.STRATEGY_ONE.getTitle(), new TestOne());
13 hashmap.put(StrategyTestEnum.STRATEGY_TWO.getTitle(), this.applicationContext.getBean(TestTwo.class));
14 hashmap.put(StrategyTestEnum.STRATEGY_THREE.getTitle(), this.applicationContext.getBean(TestThree.class));
15 }
16 }
 1 @Getter
2 public enum StrategyTestEnum {
3 STRATEGY_ONE("一", "模式一"),
4 STRATEGY_TWO("二", "模式二"),
5 STRATEGY_THREE("三", "模式三"),
6 ;
7
8 private String title;
9 private String value;
10
11 StrategyTestEnum(String title, String value) {
12 this.title = title;
13 this.value = value;
14 }
15 }

TestServiceTwo实现InitializingBean接口,InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。

定义一个hashmap集合,用来保存不同的公共接口实现类对象,这里把参数抽取成一个枚举类,利用SpringBoot的高级容器ApplicationContext,获取Bean对象,当然这里直接new一个实现类对象也是可以的,将不同的参数和实现对象封装到map集合中,实现参数和逻辑一一对应。

测试方法如下,通过hashmap的key获取对应的实现类对象,这样就不必再自定义参数类型,彻底消除了if/else,也不用暴露给方法调用者过多的业务逻辑。

1 public String testMethod2(String key) {
2
3 CommonService commonService = hashmap.get(key);
4 Assert.notNull(commonService, "参数错误,找不到模式");
5 return commonService.push(key);
6 }

最后在controller层调用方法,进行测试:

1     @Autowired
2 private TestServiceTwo testServiceTwo;
3
4 @GetMapping("/test/two")
5 public String testMethodTwo(@RequestParam(name = "key") String key) {
6
7 return testServiceTwo.testMethod2(key);
8 }

测试结果如下:

参数正确情况下:

参数错误情况下:

   利用这种自定义初始化bean+hashmap的方式完成了对策略模式的优化,优化了代码的结构,并且彻底消除了if/else,个人认为可以很好地提升代码质量。

SpringBoot自定义初始化Bean+HashMap优化策略模式实践的更多相关文章

  1. Python设计模式: 最佳的"策略"模式实践代码

    Python设计模式: 最佳的"策略"模式实践代码 今天抽空看了下流畅的python,发现里面介绍了不少python自带的库的使用实例,用起来非常的优雅. 平时用Python来写爬 ...

  2. 编写自定义的JDBC框架与策略模式

    本篇根据上一篇利用数据库的几种元数据来仿造Apache公司的开源DbUtils工具类集合来编写自己的JDBC框架.也就是说在本篇中很大程度上的代码都和DbUtils中相似,学完本篇后即更容易了解DbU ...

  3. springboot项目中使用设计模式一策略模式

    策略模式: 使用常用,支付,之前做了微信支付,支付宝支付,然后另外一个同事写了一个银联支付,那么如果代码方法一起就会导致代码不是很好操作所以,采用策略模式进行,同事只需要写一个实现类,就可以了, 在协 ...

  4. 小白写了一堆if-else,大神实在看不下去了,竟然用策略模式直接摆平了

    这里涉及到一个关键词:策略模式,那么到底什么是策略模式呢?本文就来好好给大家讲讲策略模式,大家可以带着如下几个问题来阅读本文:   1. 如何通过策略模式优化业务逻辑代码(可以根据自己从事的工作思考) ...

  5. 设计模式学习总结(八)策略模式(Strategy)

    策略模式,主要是针对不同的情况采用不同的处理方式.如商场的打折季,不同种类的商品的打折幅度不一,所以针对不同的商品我们就要采用不同的计算方式即策略来进行处理. 一.示例展示: 以下例子主要通过对手机和 ...

  6. 用工厂模式和策略模式优化过多的if-else

    多个if-else代码: @RunWith(SpringRunner.class) @SpringBootTest public class EducationalBackgroundTest { p ...

  7. ## springboot 下策略模式的简单使用

    1.灵魂三问 接手前人(已跑路)项目快乐否? 前人项目不写注释懵逼否? 一个方法中一堆if/else,且业务判断条件用简单数字(或英文字母),不带注释,想打人否?     所以,对于上述三个问题,我写 ...

  8. 新来的"大神"用策略模式把if else给"优化"了,技术总监说:能不能想好了再改?

    本文来自作者投稿,原作者:上帝爱吃苹果 目前在魔都,贝壳找房是我的雇主,平时关注一些 java 领域相关的技术,希望你们能在这篇文章中找到些有用的东西.个人水平有限,如果文章有错误还请指出,在留言区一 ...

  9. Spring 实现策略模式--自定义注解方式解耦if...else

    策略模式 定义 定义一簇算法类,将每个算法分别封装起来,让他们可以互相替换,策略模式可以使算法的变化独立于使用它们的客户端 场景 使用策略模式,可以避免冗长的if-else 或 switch分支判断 ...

随机推荐

  1. RHCAS_DAY01

    世界三大云厂商: 第一:亚马逊,AWS 第二:微软,Azure 第三:中国,阿里云,在全球15个地区建立的200多个数据中心 https://www.aliyun.com/ #阿里云地址 云计算三种模 ...

  2. Windows协议 LDAP篇 - 域用户和计算机用户

    域用户 查询域用户 通过SAMR协议查询(net user就是通过这种协议查询的),samr也不是一种专门的协议,是一个RPC接口 在impacket里有个脚本samrdump.py,就是专门调用这个 ...

  3. 【Android面试查漏补缺】之Handler详解,带你全面理解Handler消息机制

    在安卓面试中,关于 Handler 的问题是必备的,但是这些关于 Handler 的知识点你都知道吗? 一.题目层次 Handler 的基本原理 子线程中怎么使用 Handler MessageQue ...

  4. ABP框架使用Oracle数据库,并实现从SQLServer中进行数据迁移的处理

    ABP框架的数据访问底层是基于EFCore(Entity Framework Core)的,是微软标志性且成熟的ORM,因此它本身是支持多种主流数据库MySQL,SqlServer,Oracle,SQ ...

  5. SpringBoot开发十一-显示登录信息

    需求介绍-显示登录信息 我们需要在每个页面的头部都要把登录用户的头像显示出来,另外在详细信息里面你需要显示用户的名字,除此之外如果登录了,我们显示首页 信息 头像 三个功能的链接,否则显示首页 登录两 ...

  6. 浅谈 SQL 注入(注入篇)

    一.SQL注入简介 1.1 什么是SQL注入 在用户可控制的参数上过滤不严或没有任何限制,使得用户将传入的参数(如URL,表单,http header)与SQL语句合并构成一条 SQL语句传递给web ...

  7. 002 PCI Express体系结构(二)

    一.PCI总线的信号定义 PCI总线是一条共享总线,在一条PCI总线上可以挂接多个PCI设备.这些PCI设备通过一系列信号与PCI总线相连,这些信号由地址/数据信号.控制信号.仲裁信号.中断信号等多种 ...

  8. miniFTP项目实战六

    项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...

  9. 《JERRY Hexo & GitHub 静态网站搭建说明》

    JERRY-Hexo-GitHub <JERRY Hexo & GitHub 静态网站搭建说明> 原创内容,转载请注明出处! 一.前言 1.1 什么是 Hexo? 一个基于 Nod ...

  10. noip 模拟4

    咕 题都改不完怎么可能有空写题解啊啊啊