作者:蜗蜗小小牛

链接:https://www.cnblogs.com/perryzjl/p/11097106.html

使用spring容器干掉if-else

场景说明

最近新做一个项目,需要对不同店铺的商品做不同处理。例如storeA需要进行handleA操作,storeB需要进行handleB操作,如此类推

大家很容易会想到下面的实现方法

 
public void handle(String storeName) { //店铺A做操作handleA处理 if(storeName.equals("storeA")) { handleA(); } else if (storeName.equals("storeB")) { handleB(); //店铺B做操作handleB处理 } else { //其他处理 } } 

确实上面的代码实现简单易懂,但是如果店铺越来越多,操作也越来越多的情况下,每新增一个店铺都需要在这里添加一次if else,大大的降低了代码的可维护性。

解决办法

这个时候我们会希望可以各个店铺的处理逻辑之间没有关联,互不影响。

抽象接口

我们所有的店铺都会进行对应的操作,所以首先我们将方法抽象出来

 
public interface Store { void handle(); } 

根据不同店铺做不同处理

 
@Service("storeA") public class StoreA implements Store { @Override void handle() { //handleA操作 } } @Service("storeB") public class StoreB implements Store { @Override void handle() { //handleB操作 } } 

添加工厂类

这样还是有问题,因为还是要在业务代码中写if-else来判断到底是哪家store来进行操作,这个时候可以写一个工厂类。

 
public class StoreFactory { @Autowired @Qualifier("storeA") private StoreA storeAA; @Autowired @Qualifier("storeB") private StoreB storeBB; //其他实现对象 public Store getStore(String storeName) { if (storeName.equals("storeA")) { return storeAA; } else if (storeName.equals("storeB")) { return storeBB; }//其他的条件下,返回其他的对象 } } 

添加工厂类后,我们在要获取店铺store时只需要调用getStore(String storeName)并传入店铺对象名即可,具体返回哪个对象,是storeA还是storeB,就交给工厂类来处理。

想免费学习(Java工程化、分布式架构、高并发、高性能、深入浅出、微服务架构、Spring、MyBatis、Netty、源码分析)等技术的朋友,可以加群:834962734,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家,欢迎进群一起深入交流学习,不管你是转行,还是工作中想提升自己能力都可以!

还是免不了写if else,改造StoreFactory

在提供了工厂类之后,还是免不了写很多的条件判断,只不过是把所有的条件判断写在了一起。这时随着产品数量的增多,if else 也会不停地增多,维护起来依然费劲。

这里spring容器就可以派上用场了。spring中有一个BeanFactory对象,也是一个工厂,我们可以用它来改造StoreFactory。

 
public class StoreFactory { @Autowired private BeanFactory beanFactory; public Store getStore(String storeName) { Object bean = beanFactory.getBean(storeName); if (bean instanceof Store) { return (Store) bean; } throw new UnsupportedOperationException("不支持的店铺:" + storeName); } } 

也可以利用Map自动装配进行代码精简

 
@Service public class StoreFactory { @Autowired Map<String, Store> stores = new ConcurrentHashMap<>(); //会在初始化的时候将所有的Store自动加载到Map中 public Store getStore(String store) { Store store = stores.get(store); if (store == null) { throw new RuntimeException("no store defined"); } return store; } } 

@Autowired的源码中有这样一段注释,大意就是@Autowired用于Collection或者Map类型时,容器会自动装配所有已声明的value类型的beans。

 
/* <p>In case of a {@link java.util.Collection} or {@link java.util.Map} dependency type, * the container autowires all beans matching the declared value type. For such purposes, * the map keys must be declared as type String which will be resolved to the corresponding * bean names. Such a container-provided collection will be ordered, taking into account * {@link org.springframework.core.Ordered}/{@link org.springframework.core.annotation.Order} * values of the target components, otherwise following their registration order in the * container. Alternatively, a single matching target bean may also be a generally typed * {@code Collection} or {@code Map} itself, getting injected as such. */ 

以上就是全部内容。

转载于:https://my.oschina.net/u/3967312/blog/3067013

你还在用if-else吗?相关推荐

  1. 机器都会学习了,你的神经网络还跑不动?来看看这些建议

    在很多机器学习的实验室中,机器已经进行了上万小时的训练.在这个过程中,研究者们往往会走很多弯路,也会修复很多bug,但可以肯定的是,在机器学习的研究过程中,学到经验和知识的并不仅仅是机器,我们人类也积 ...

  2. Adam那么棒,为什么还对SGD念念不忘 (1) —— 一个框架看懂优化算法

    机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着丹药出炉了. 不过,当过厨子的都知道,同样的食材,同样的菜谱,但火候不一样了, ...

  3. Adam那么棒,为什么还对SGD念念不忘 (3)—— 优化算法的选择与使用策略

    在前面两篇文章中,我们用一个框架梳理了各大优化算法,并且指出了以Adam为代表的自适应学习率优化算法可能存在的问题.那么,在实践中我们应该如何选择呢? 本文介绍Adam+SGD的组合策略,以及一些比较 ...

  4. Adam那么棒,为什么还对SGD念念不忘 (2)—— Adam的两宗罪

    在上篇文章中,我们用一个框架来回顾了主流的深度学习优化算法.可以看到,一代又一代的研究者们为了我们能炼(xun)好(hao)金(mo)丹(xing)可谓是煞费苦心.从理论上看,一代更比一代完善,Ada ...

  5. ❤️手撕这十道HiveSQL题还不能吊打面试官,却能保你不被吊打❤️【推荐收藏】

    全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 HiveSQL十题 第一题 1.需求 2.数据准备 3. ...

  6. 织梦手机站下一篇变上一篇而且还出错Request Error!

    最新的织梦dedecms程序手机版下一篇变上一篇而且还出错Request Error!,这是因为官方写错了一个地方 打开 /include/arc.archives.class.php 找到 $mli ...

  7. spfa(还不懂--)

    粗略讲讲SPFA算法的原理,SPFA算法是1994年西安交通大学段凡丁提出 是一种求单源最短路的算法 算法中需要用到的主要变量 int n;  //表示n个点,从1到n标号 int s,t;  //s ...

  8. 除了java还学什么_学好Java编程除了努力还需要具备什么?

    Java编程语言的热流席卷了全球,它的出现摆脱了C语言尾大不掉的困境,灵活.多变,塑造性强的特点不仅符合当下互联网的发展趋势,也得到一批批青年俊才的青睐,Java编程抛出的橄榄枝,也吸引了大量计算机专 ...

  9. 4g运行内存手机还能用多久_看完就明白:目前手机运行内存超过4G就是浪费

    腾讯数码讯(文心)据Android Central网站报道,vivo 乎要推出一款运行内存容量高达10GB的手机.这意味着这款手机运行内存容量堪比许多游戏PC,比大多数手机多约6GB.这让许多手机用户 ...

  10. python until怎么用不了_为何你还不懂得如何使用Python协程

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

最新文章

  1. Ubuntu 14.04 64位字体美化(使用文泉驿微黑)
  2. WIN7、XP局域网共享问题和重置IP协议
  3. 何时使用cla(),clf()或close()在matplotlib中清除图?
  4. 1.5 Python基础知识 - while循环
  5. linux CentOs 权限导致的Apache - DocumentRoot must be a directory的解决方案
  6. Azure Arc:微软是怎么玩多云游戏的?
  7. java私有属性和私有方法_Java 9中什么是私有的?
  8. wordpress教程之函数site_url()、home_url()、bloginfo(‘url’)的区别
  9. 走火入魔.NET从C/S单点登录到B/S系统的例子,SUID(System Unique Identification)
  10. springcloud之eureka客户端的注册
  11. 【ESP 保姆级教程】疯狂传感器篇 —— 案例:ESP8266 + 光敏光照传感器 + 串口输出
  12. 微信公众号 开发详解04【编辑器、图片收集、动图Gif、截图软件、去水印】
  13. python图片内容长度识别_python 图片中的表格识别
  14. C语言实现峰度的计算
  15. 计算机进行运算时为什么采用二进制数,计算机中为什么采用二进制
  16. 实验一 Java编程基础
  17. Go实战--也许最快的Go语言Web框架kataras/iris初识四(i18n、filelogger、recaptcha)
  18. 谷歌浏览器如何查看及设置网页编码格式(亲测可用)
  19. 阿里巴巴编程规范(new)
  20. 《波斯王子·时之沙三部曲》剧情总结

热门文章

  1. 小指数rsa 多线程版writeup
  2. 构建风控评分卡模型介绍(WOE/KS/ROC)
  3. github 国内替代产品_2020年7种最佳Github替代品
  4. 2021-08-23 FM24C04写入数据时,跨页会导致指针指向本页的起始地址
  5. 数据安全评估体系建设
  6. typedef——用法总结
  7. bezier曲面制作,SU技巧 | Bezier Surface(贝兹曲面)
  8. 13.集合框架ListSet
  9. pytorch_sparse教程
  10. nodejs中cmd命令大全