参考设计模式 - 策略模式我们可以优化if-else代码段,而在Spring(Boot)中,借助ApplicationContext扫描,可以使代码更加干净。

话不多说,亮代码:

首先按照策略模式的写法,创建一个Handle接口,用于区分处理策略。

public interface ITypeHandle {
/**
* 不同的业务操作
*
* @return 对应的操作结果
*/
String working(); /**
* 声明用于处理的业务(方便查看而已)
*
* @return 业务名称
*/
String handleType();
}

然后创建对应的唤醒处理机和睡觉处理机

// 起床操作
public class WakeTypeHandle implements ITypeHandle {
@Override
public String working() {
try {
// 模拟业务操作
Thread.sleep(100);
} catch (Exception ex) {
return "Wake Interrupt";
}
return "Wake up Wake up Wake up";
} @Override
public String handleType() {
return "wake";
}
}
// 睡觉操作
public class SleepTypeHandle implements ITypeHandle {
@Override
public String working() {
try {
// 模拟业务操作
Thread.sleep(500);
} catch (Exception ex) {
return "Sleep Interrupt";
}
return "Sleep Sleep Sleep Zzzzzzzzzzzzz";
} @Override
public String handleType() {
return "sleep";
}
}

简单来说,策略模式的操作方式是通过上下文切换不同的处理机来处理不同的业务。在Spring中,可以借助ApplicationContext和ComponentScan来完成。

建立策略工厂

public class TypeHandleFactory {
private Map<String , ITypeHandle> map; @Autowired
private ApplicationContext applicationContext; @PostConstruct
private void init(){
Map<String ,ITypeHandle> beans=applicationContext.getBeansOfType(ITypeHandle.class);
map= new HashMap<>(beans.size());
for (ITypeHandle handle : beans.values()) {
map.put(handle.handleType(),handle);
}
}
public ITypeHandle getInstance(String type){
return map.get(type);
}
}

这里的初始化应当在ApplicationContext注入完成后进行,因此添加@PostConstruct注解。在Spring中,类执行主要注解的顺序为构造方法=>@Autowired=>@PostConstruct=>@PreDestroy=>销毁。另外需要在策略工厂和两个处理机上添加@Component注解或由@ComponentScan扫描。

添加一个Service类来模拟业务层:

@Service
public class MainServiceImpl {
@Autowired
private TypeHandleFactory factory ;
@Override
public String work(String type){
ITypeHandle handler = factory.getInstance(type);
return handler.working();
}
}

至此,我们已经完成了策略模式在Spring中的构建。可以编写测试类测试:

@SpringBootTest
class MainServiceImplTest {
@Autowired
private MainServiceImpl service;
@Test
void work(){
String typeA="wake";
String typeB="sleep";
System.out.println(service.work(typeA));
System.out.println(service.work(typeB));
}
}

日志打印为:

Wake up Wake up Wake up
Sleep Sleep Sleep Zzzzzzzzzzzzz

策略模式在Spring中的优化完成。

缩减项目代码中的大面积if策略的更多相关文章

  1. 在项目代码中载入cocostudio导出的动画并循环播放

    须要在代码中引入#include "cocostudio/CocoStudio.h" using namespace cocostudio; ArmatureDataManager ...

  2. Weblogic部署web项目代码中获取项目名为null的问题

    写在前面 这个问题之前遇到一次, 时间久就忘了, 还是好记性不如烂笔头, 记一下吧.Windows下部署到Tomcat和Linux下部署到Weblogic的获取项目名写法. 关键代码 java代码 w ...

  3. iOS项目开发中的知识点与问题收集整理①(Part 一)

    前言部分 注:本文并非绝对原创 大部分内容摘自 http://blog.csdn.net/hengshujiyi/article/details/20943045 文中有些方法可能已过时并不适用于现在 ...

  4. iOS项目开发中的知识点与问题收集整理①

    前言部分 注:本文并非绝对原创 大部分内容摘自 http://blog.csdn.net/hengshujiyi/article/details/20943045 文中有些方法可能已过时并不适用于现在 ...

  5. Webpack 2 视频教程 017 - Webpack 2 中分离打包项目代码与组件代码

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  6. 如何在java代码中调用一个web项目jsp或者servlet

    有时候需要调用一个web项目的jsp或者servlet,但是执行内部的代码,并不是打开jsp,例如需要在一段java代码中清除一个web项目中的缓存,那么可以把清除缓存的代码放在该web项目的一个se ...

  7. 策略模式+注解 干掉业务代码中冗余的if else...

    前言: 之前写过一个工作中常见升级模式-策略模式 的文章,里面讲了具体是怎样使用策略模式去抽象现实中的业务代码,今天来拿出实际代码来写个demo,这里做个整理来加深自己对策略模式的理解.   一.业务 ...

  8. 在ASP.NET项目中的web.config文件里配置数据库连接并在程序代码中获取连接字符串

      1.在<connectionStrings> 标签里添加连接 <connectionStrings> <add name="ConnectionName&q ...

  9. Vue-cli构建项目, 组件中js代码引入图片路径问题

    问题描述 .vue的组件分成三个部分, template结构部分, script路径代码, style页面样式 首先, 我们可以在template可以正确引入, 无论是dev, 还是build都没有问 ...

随机推荐

  1. 剑指Offer-Python(11-15)

    11.二进制中1的个数 链接:https://www.nowcoder.com/questionTerminal/8ee967e43c2c4ec193b040ea7fbb10b8?answerType ...

  2. Mycat分库分表(一)

    随着业务变得越来越复杂,用户越来越多,集中式的架构性能会出现巨大的问题,比如系统会越来越慢,而且时不时会宕机,所以必须要解决高性能和可用性的问题.这个时候数据库的优化就显得尤为重要,在说优化方案前,先 ...

  3. Vue2.0源码分析

    Vue其实是用Function写的一个class: 1.通过一系列的函数给Vue.prototype上动态挂载方法和属性 2.通过initGlobalAPI(Vue)给Vue本身扩展全局API 数据驱 ...

  4. MongoDB基础教程(安装、操作、配置)

    MongoDB 下载安装 简易安装 # redhat, centOS sudo yum install -y mongodb # debian, ubuntu sudo apt install -y ...

  5. 【JVM第二篇--类加载机制】类加载器与双亲委派模型

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.什么是类加载器 在类加载过程中,加载阶段有一个动作是"通过一个类的全限 ...

  6. 调度器简介,以及Linux的调度策略(转)

    进程是操作系统虚拟出来的概念,用来组织计算机中的任务.但随着进程被赋予越来越多的任务,进程好像有了真实的生命,它从诞生就随着CPU时间执行,直到最终消失.不过,进程的生命都得到了操作系统内核的关照.就 ...

  7. Python生成csv中文乱码解决办法

    前言 在Linux下面用python进行数据处理,然后输出为csv格式,如果没有中文一切正常,但是如果有中文,就会出现乱码的问题,本篇将讲述怎么处理这个问题 处理过程 原始代码 #!/usr/bin/ ...

  8. 用十一张图讲清楚,当你CRUD时BufferPool中发生了什么!以及BufferPool的优化!

    一.收到了大佬们的建议 1.篇幅偏短,建议稍微加长一点. 这点说的确实挺对,有的篇幅确实比较短,针对这个提议我会考虑将相似的话题放在一篇文章中.但是这可能会导致我中断每天更新的步调,换成隔几天发一篇的 ...

  9. Dockerfile中如何自动回答标准输入的问题

    前言大家在用docker build制作自己的image的時候,都会用RUN命令来执行一些操作来安装某些必须的软件. 而一些软件的安装过程中会需要用户来输入yes/no或者y/n来确定一些东西后才能进 ...

  10. BurpSuite 抓安卓app包

    认准夜神安卓模拟器,下了几个其他的模拟器都没有代理的功能 一.夜神安卓模拟器设置代理 1.点击右下角的设置 2.点击设置,进入到WIFI连接选项 3.进入列表后,鼠标点击wifi位置,长按左键,会出现 ...