新闻资讯
Java设计模式-策略模式(优化过多if/switch语句)
发布时间:2024-03-12
  |  
阅读量:
字号:
A+ A- A

策略模式是指有一定行动内容的相对稳定的策略名称,策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法

策略模式:

  • 定义了一组算法(业务规则)
  • 封装了每个算法
  • 这族的算法可互换代替
  • 抽象策略角色: 策略类,通常由一个接口或者抽象类实现

  • 具体策略角色:包装了相关的算法和行为

  • 环境角色:持有一个策略类的引用,最终给客户端调用

  1. 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为

  2. 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现

  3. 对客户隐藏具体策略(算法)的实现细节,彼此完全独立

  4. 一个类定义了多种行为,并且这些行为在类的操作中以多个条件语句的形式出现

  • 策略模式符合开闭原则

  • 避免使用多重条件转移语句,如if...else...语句、switch 语句

  • 使用策略模式可以提高算法的保密性和安全性

  • 客户端必须知道所有的策略,并且自行决定使用哪一个策略类

  • 代码中会产生非常多策略类,增加维护难度









通过if-else获取策略类



image.png

  • 如图,通过传入不同的收费类型,由策略工厂进行判断,赋予相应的处理策略
  • 可以看到,如果通过if语句来获取不同的税策略,当增加新的税策略时就不得不修改已有代码,当方法很多时,就不那么好看,同时也增加了复杂度

通过Map获取策略类



image.png

  • 可以看到,通过map进行获取策略结果相同,进化后if语句没有了,减少了复杂度,增加新的策略后只需调用策略注册接口就好,不需要修改获取策略的代码

通过策略自动注册获取策略类

策略类添加自动注册策略的方法


具体策略实现类





image.png

  • 可以看到,通过策略自动注册进行获取策略结果相同,当添加新的税策略时,就完全不需要修改已有的策略工厂代码,基本完美做到开闭原则,唯一需要修改的是类型定义

通过注解减少耦合

新增加自定义注解类


策略去掉了注册方法,添加ChargeTypeAnnotation注解来识别是哪种税类型




注解类策略工厂



image.png

  • 可以看到,通过注解方式确定策略类的方式获取策略结果相同,是代码更加简洁。

注意: 测试阶段这么写不会出问题,但是小编在通过优化代码时,调用接口,发现这样会导致注入的对象为null值,从而导致程序报空指针异常,起初没发现,不知道为什么按照正常程序开发,会导致通过autowired方式注入为null,经过查阅资料和断点代码,发现了问题所在

image.png

  • 图中框住的部分,通过反射代码获取类的时候,我们获得类的方式是 class.newInstance, 这种写法没有与Spring容器关联起来获取bean,虽然也能拿到但是如果类里面有@Autowired这种方式注入的对象就会空了
解决方式

通过spring上下文获得类



  • 通过这种方式就可以解决上述问题,完成自动注册策略的优化

  • 小编这篇文章是通过日常开发当中遇到的问题,然后通过查前人写过的代码和资料,完成优化,多看一些好的代码能解决许多问题,大家一定要多多学习,多多进步

今天的分享就到这里啦,希望能给您带来帮助!!!

平台注册入口