策略模式的定义
策略模式就是有一系列算法,这些算法只是行为上的不同,将这些算法一一封装起来,然后使得他们能够相互替换。
策略模式的关键类
策略接口:定义一个策略接口,起到约束具体策略类的作用,将具体的策略实例赋值给策略接口对象,在环境类中直接调用这个策略接口对象的相关方法,这样在用不同的策略类赋值给策略接口对象后,环境类后面的代码都不需要改动的。
具体的策略类:将具体的算法封装到策略类中,并实现统一的策略接口。
环境类:持有一个策略类的引用,最终给客户端调用。
策略模式的好处:
1.便于扩展,当有新的算法的时候,可以将它封装成一个策略类,替换其他的策略类,环境类中其他代码都不用改动的。
2.避免了if else这种多重判断,if else这种多重判断比较复杂和难以维护
策略模式的坏处:
1.要是算法种类太多的话,可能每一个算法行为都要生成一个新的类,这样的类就会有很多个。
2.要暴露所有的算法行为。
策略模式结构示意图:
策略模式具体的例子:
我们知道在springmvc中有一个很重要的组件,那就是HandlerMapping,在DispatcherServlet中应用HandlerMapping就可以看成是一个策略模式,HandlerMapping的作用就是通过url找到执行这个请求的类,HandlerMapping有三个具体的实现类:
RequestMappingHandlerMapping:通过url和解读注解找到具体的类
SimpleUrlHandlerMapping:通过url和配置匹配找到具体的类
BeanNameUrlHandlerMapping:通过url和beanName匹配找到具体的类
可以看出这三个HandlerMapping的实现类的作用都是相同的,只是行为模式不一样,而且他们都实现了HandlerMapping接口。DispatcherServlet只是根据IOC容器中注册的具体HandlerMapping对象,将他们选择出来最后对url进行解析,选择不同的HandlerMapping实现类进行解析都不会影响后面的执行流程。当然具体的源码来看,这个策略模式可能不是那么标准,但是策略模式的思想是用到了的。