缩减项目代码中的大面积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都没有问 ...
随机推荐
- 谈谈对不同I/O模型的理解 (阻塞/非阻塞IO,同步/异步IO)
一.关于I/O模型的问题 最近通过对ucore操作系统的学习,让我打开了操作系统内核这一黑盒子,与之前所学知识结合起来,解答了长久以来困扰我的关于I/O的一些问题. 1. 为什么redis能以单工作线 ...
- 小学生学习C++应该具备哪些基础?
一.电脑操作基础: 应该具备一些必要的电脑相关的知识,如操作系统的相关知识,如何打开.编辑.保存文件.对电脑的能力有一些基本的认识,以及会使用鼠标,键盘熟练输入. 磨刀不误砍柴工,至少要做到能快速找到 ...
- css布局中的BFC
1.BFC的区域会与float的元素区域重叠 2.计算BFC的高度时,浮动子元素也参与计算 3.BFC就是页面上的一个隔离的独立容器,容器里面的子元素是不会影响到外面的元素 4.BFC意为" ...
- IDEA安装leetcode editor插件
leetcode > https://leetcode-cn.com/ 本地idea刷题可以直接同步提交,测试等相关操作 需要安装leetcode editor插件 1.idea setting ...
- 极客mysql16
1.MySQL会为每个线程分配一个内存(sort_buffer)用于排序该内存大小为sort_buffer_size 1>如果排序的数据量小于sort_buffer_size,排序将会在内存中完 ...
- ceph的df容量显示计算
显示数据 [root@lab201 ~]# ceph df GLOBAL: SIZE AVAIL RAW USED %RAW USED 1092T 404T 688T 63.01% POOLS: NA ...
- rbd的数据在哪里
创建一个rbd [root@mytest ~]# rbd create test1 --size 4000 查看rbd信息 [root@mytest ~]# rbd info test1 rbd im ...
- Spring Cloud Security OAuth2.0 认证授权系列(一) 基础概念
世界上最快的捷径,就是脚踏实地,本文已收录[架构技术专栏]关注这个喜欢分享的地方. 前序 最近想搞下基于Spring Cloud的认证授权平台,总体想法是可以对服务间授权,想做一个基于Agent 的无 ...
- [原题复现+审计][网鼎杯 2018] WEB Fakebook(SSRF、反序列化、SQL注入)
简介 原题复现: 考察知识点:SSRF.反序列化.SQL注入 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 过 ...
- [web安全原理]PHP命令执行漏洞基础
前言 PHP命令执行漏洞 应用程序的某些功能功能需要调用可以执行系统命令的函数,如果这些函数或者函数的参数被用户控制,就有可能通过命令连接符将恶意命令拼接到正常的函数中,从而随意执行系统命令,这就是命 ...