参考设计模式 - 策略模式我们可以优化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. 【转载】VirtualBox 扩展增强包安装

    1 扩展包作用 鼠标可自动在虚拟机和物理机中切换状态,而不用按快捷键解除独占功能 安装了扩展包后,可以解决 virtualbox 中 更改 ubuntu 分辨率无效的问题 2 原文地址 星朝 - Vi ...

  2. CSS之calc()

    calc() 函数支持任意CSS长度单位的混合计算,遵循标准数学运算优先级规则,可以动态计算长度值.注意,calc()函数内部的运算符两侧各加一个空白符,否则会产生解析错误. calc()使用的难点在 ...

  3. Databricks说的Lakehouse是什么?

    在过去的几年里,Lakehouse作为一种新的数据管理范式,已独立出现在Databricks的许多用户和应用案例中.在这篇文章中,我们将阐述这种新范式以及它相对于之前方案的优势. 数据仓库在决策支持和 ...

  4. 搭建vue-cli4.0项目

      ① Vue CLI的包名称由 vue-cli 改成了 @vue/cli. 如果已经全局安装了旧版本的 vue-cli(1.x或2.x), 你需要先通过 npm uninstall vue-cli ...

  5. 问题记录-CoordinatorLayout+WebView使用遇到的问题

    需求背景: 使用CoordinatorLayout+viewpager+tablayout+webview实现首页折叠效果. 使用问题: 在使用过程中首页的页面为原生/h5混合页,在原生页面正常,嵌套 ...

  6. tigervnc 编译

    1.根据BUILDING.txt安装依赖(建议使用默认路径) 其中X11 development kit使用 yum install libX11* 2.修改CMakeList.txt 在前面添加 s ...

  7. IIC、SPI、UART协议总结

    IIC 特点 1.Inter-Integrated Circuit,内部集成总线,半双工 2.短距离传输,有应答,速度较慢 3.SDA双向数据线,SCL时钟线 4.可以挂载多个设备,IIC设备有固化地 ...

  8. linux常用配置文件和命令总结

    常用配置文件说明: 1..设置-n永远生效:Vim的配置文件:命令模式想永久生效, ~/.vimrc,新建文件,在里面输入保存即可 2.设置别名永远生效:在~/.bashrc  修改当前用户家目录里的 ...

  9. 《Machine Learning in Action》—— Taoye给你讲讲决策树到底是支什么“鬼”

    <Machine Learning in Action>-- Taoye给你讲讲决策树到底是支什么"鬼" 前面我们已经详细讲解了线性SVM以及SMO的初步优化过程,具体 ...

  10. Java面试必会-微服务权限认证

    微服务身份认证方案 1. 单点登录(SSO) 这种方案意味着每个面向用户的服务都必须与认证服务交互,这会产生大量非常琐碎的网络流量和重复的工作,当动辄数十个微应用时,这种方案的弊端会更加明显. 2. ...