前言
在日常开发中我们经常会碰到许多if else,如果if else过多,代码就会变得难以维护,这时候我们就可以使用工厂+策略+模板模式来优化代码,让代码更加清晰,易于维护, 本文将着重讲解 springboot 项目中的实现案例,带领大家体会设计模式开闭原则带来的好处。
一、业务需求
例如手机系统中很多应用需要提供多支付方式扣款,目前需要支持支付宝、微信和云闪付这个三种支付方式
if else 写法伪代码如下:
1 | public boolean pay(Integer payType, BigDecimal money) { |
二、代码实现
1.工厂模式
springboot 中通过 @Resource private List<AbstractHandler> handlers, @Resource private Map<String, AbstractHandler> 能将所有的继承抽象类或者实现接口的类注入到对应的List或Map中;在此前提下, AppFactory 通过实现了 InitializingBean 的 afterPropertiesSet() 方法,在初始化bean后将系统中所有的 handler 注册到 strategyMap ,那么新增策略就不需要我们手动维护到 strategyMap 中。
(不使用模板模式可以将 AbstractHandler 都替换成 Handler )
1 | package com.xxx.design.pattern.service; |
2.策略模式+模板模式
方式1.定义接口 (适用于所有策略都是统一接口的场景)
1 | package com.xxx.design.pattern.handler; |
方式2.定义抽象类 (这里采用的就是模板模式,适用于所有策略支持灵活拓展方法的场景,如云闪付没有聊天功能,就不需要实现聊天方法即可)
1 | package com.xxx.design.pattern.handler; |
支付宝策略类实现 (不使用模板模式可以将 extends AbstractHandler 替换成 implements Handler )
1 | package com.xxx.design.pattern.handler; |
微信策略类实现
1 | package com.xxx.design.pattern.handler; |
云闪付策略类实现
1 | package com.xxx.design.pattern.handler; |
从上面的三种策略类的实现,我们不难看出,工厂+策略模式的写的多支付代码,添加一种新的支付方式只需要在代码中新增一种 handler 的策略类(重写 getType() 和 pay() 方法),体现了设计模式的开闭原则: 对扩展开放,对修改封闭。
3.测试类
1 | package com.xxx.design.pattern; |
执行结果:
1 | 2023-08-02 11:22:33.556 INFO 11388 --- [ main] c.c.design.pattern.DesignPatternTest : Started DesignPatternTest in 3.817 seconds (JVM running for 5.059) |
- 本文作者: yinshuang
- 本文链接: https://yinshuang007.github.io/2023/08/01/工厂-策略模式优化代码中的if-else/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!