只需要每一个策略服务的实现类都实现 InitializingBean 接口,并实现其 afterPropertiesSet 方法,在这个方法中调用 UserPayServiceStrategyFactory.register 即可 。
这样,在 Spring 初始化的时候,当创建 VipPayService、SuperVipPayService 和 ParticularlyVipPayService 的时候,会在 Bean 的属性初始化之后,把这个 Bean 注册到 UserPayServiceStrategyFactory 中 。
以上代码,其实还是有一些重复代码的,这里面还可以引入模板方法模式进一步精简,这里就不展开了 。
还有就是,UserPayServiceStrategyFactory.register 调用的时候,第一个参数需要传一个字符串,这里的话其实也可以优化掉 。
比如使用枚举,或者在每个策略类中自定义一个 getUserType 方法,各自实现即可 。
总结
本文,我们通过策略模式、工厂模式以及 Spring 的 InitializingBean,提升了代码的可读性以及可维护性,彻底消灭了一坨 if-else 。
文中的这种做法,大家可以立刻尝试起来,这种实践,是我们日常开发中经常用到的,而且还有很多衍生的用法,也都非常好用 。有机会后面再介绍 。
其实,如果读者们对策略模式和工厂模式了解的话,文中使用的并不是严格意义上面的策略模式和工厂模式 。
首先,策略模式中重要的 Context 角色在这里面是没有的,没有 Context,也就没有用到组合的方式,而是使用工厂代替了 。
另外,这里面的 UserPayServiceStrategyFactory 其实只是维护了一个 Map,并提供了 Register 和 Get 方法而已,而工厂模式其实是帮忙创建对象的,这里并没有用到 。
所以,读者不必纠结于到底是不是真的用了策略模式和工厂模式 。而且,这里面也再扩展一句,所谓的 GOF 23 种设计模式,无论从哪本书或者哪个博客看,都是简单的代码示例,但是我们日常开发很多都是基于 Spring 等框架的,根本没办法直接用的 。
所以,对于设计模式的学习,重要的是学习其思想,而不是代码实现!!!希望通过这样的文章,读者可以真正的在代码中使用上设计模式 。
推荐阅读
- MySQL中七个查询命令的优先级及特点
- 千万级MySQL数据库建立索引,提高性能的秘诀
- 开发者必须了解的22个常用小程序开发api接口
- Nginx 模块的基本结构
- 通过监控DNS记录,来保护网站的几种方式?你需要了解
- 细说HTTP协议及其工作流程
- 5 种用 CSS 隐藏页面元素的方法
- 瓷砖用什么擦会发亮,瓷砖脏的发黑怎么清理
- 什么是窗户的k值,门窗k值一般是多少
- 床单用法兰绒的好吗,婴儿能睡法兰绒床单吗
