缩减项目代码中的大面积if策略
参考设计模式 - 策略模式我们可以优化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策略的更多相关文章
- 在项目代码中载入cocostudio导出的动画并循环播放
须要在代码中引入#include "cocostudio/CocoStudio.h" using namespace cocostudio; ArmatureDataManager ...
- Weblogic部署web项目代码中获取项目名为null的问题
写在前面 这个问题之前遇到一次, 时间久就忘了, 还是好记性不如烂笔头, 记一下吧.Windows下部署到Tomcat和Linux下部署到Weblogic的获取项目名写法. 关键代码 java代码 w ...
- iOS项目开发中的知识点与问题收集整理①(Part 一)
前言部分 注:本文并非绝对原创 大部分内容摘自 http://blog.csdn.net/hengshujiyi/article/details/20943045 文中有些方法可能已过时并不适用于现在 ...
- iOS项目开发中的知识点与问题收集整理①
前言部分 注:本文并非绝对原创 大部分内容摘自 http://blog.csdn.net/hengshujiyi/article/details/20943045 文中有些方法可能已过时并不适用于现在 ...
- Webpack 2 视频教程 017 - Webpack 2 中分离打包项目代码与组件代码
原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...
- 如何在java代码中调用一个web项目jsp或者servlet
有时候需要调用一个web项目的jsp或者servlet,但是执行内部的代码,并不是打开jsp,例如需要在一段java代码中清除一个web项目中的缓存,那么可以把清除缓存的代码放在该web项目的一个se ...
- 策略模式+注解 干掉业务代码中冗余的if else...
前言: 之前写过一个工作中常见升级模式-策略模式 的文章,里面讲了具体是怎样使用策略模式去抽象现实中的业务代码,今天来拿出实际代码来写个demo,这里做个整理来加深自己对策略模式的理解. 一.业务 ...
- 在ASP.NET项目中的web.config文件里配置数据库连接并在程序代码中获取连接字符串
1.在<connectionStrings> 标签里添加连接 <connectionStrings> <add name="ConnectionName&q ...
- Vue-cli构建项目, 组件中js代码引入图片路径问题
问题描述 .vue的组件分成三个部分, template结构部分, script路径代码, style页面样式 首先, 我们可以在template可以正确引入, 无论是dev, 还是build都没有问 ...
随机推荐
- hive 下载和导入数据 hive -e
1. 从97导出dim_channel_terminal_flag表数据到txt(数据下载) hive -e 'select * from dim.dim_city' >> dim_cit ...
- bss、弱符号强符号、common块、未初始化的全局变量------程序员的自我修养-链接装载与库
- 爬虫练习之正则表达式爬取猫眼电影Top100
#猫眼电影Top100import requests,re,timedef get_one_page(url): headers={ 'User-Agent':'Mozilla/5.0 (Window ...
- MySQL索引背后的数据结构及原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- ASP.NET Core管道详解[2]: HttpContext本质论
ASP.NET Core请求处理管道由一个服务器和一组有序排列的中间件构成,所有中间件针对请求的处理都在通过HttpContext对象表示的上下文中进行.由于应用程序总是利用服务器来完成对请求的接收和 ...
- workerman搭建聊天室
首先,先打开官网手册 http://doc.workerman.net/ 根据手册里安装里的提示,完成环境检测,和安装对应的扩展,并把对应的WorkerMan代码包下载解压至根目录 在根目录下创建 ...
- Maven一定要会的这几个知识!
一.Maven概念 Maven是一个项目管理和整合工具.Maven为开发者提供了一套完整的构建生命周期框架.开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置,因为Maven使用了一个标准的目 ...
- Sound Forge常规功能详解
Sound Forge是一款有口皆碑的音频编辑软件,专为录音.母带处理和音频编辑开发.但是该如何使用Sound Forge呢,Sound Forge经常用到的功能有哪些呢?今天小编通过该文章给大家进行 ...
- Pytest自动化测试 - 简易教程
简介 pytest是动态编程语言Python专用的测试框架,它具有易于上手.功能强大.可扩展性好.兼容性强.效率高.第三方插件丰富等特点. 功能特征: 完整的文档,包括安装,教程和PDF文档 简单而又 ...
- ⭐NES.css推荐⭐
今天发现一个有意思的CSS框架,叫NES.css 官网地址:https://nostalgic-css.github.io/NES.css/ gitHub地址:https://github.com/n ...