策略模式(Strategy Pattern):
定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。
对于策略模式来说了解清楚它三个角色的作用,基本就差不多了。
策略模式的三个角色:
- Context封装角色
它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
- Strategy抽象角色
策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。
- ConcreteStrategy具体策略角色
实现抽象策略中的操作,含有具体的算法,即具体的策略实现。
下面是代码实现
package com.jd.current.strategy; /** * 抽象的策略角色 * @author zhengxun * @version 2017-05-06 */ public interface Strategy { public void doSomething(); }
package com.jd.current.strategy; /** * 抽象的策略角色 * @author zhengxun * @version 2017-05-06 */ public interface Strategy { public void doSomething(); }
package com.jd.current.strategy; /** * 具体的策略1 * @author zhengxun * @version 2017-05-06 */ public class ConcreteStrategy1 implements Strategy{ public void doSomething() { System.out.println("策略1"); } }
package com.jd.current.strategy; /** * 具体的策略2 * @author zhengxun * @version 2017-05-06 */ public class ConcreteStrategy2 implements Strategy{ public void doSomething() { System.out.println("策略2"); } }
package com.jd.current.strategy; /** * 封装角色 * @author zhengxun * @version 2017-05-06 */ public class Context { private Strategy strategy = null; public Context(Strategy strategy) { this.strategy = strategy; } public void doSometing(){ this.strategy.doSomething(); } }
策略模式的优点
- 算法可以自由切换
只要实现抽象策略,就可以通过Context对其进行调用
- 避免使用多重条件判断
- 扩展性良好
添加一个策略仅仅实现接口就可以了
策略模式的缺点
- 策略类数量增多
- 所有的策略类都需要对外暴露
策略模式的使用场景
- 多个类只有在算法和行为上稍有不同的场景。
例如某些if 条件判断 switch 判断,如果判断条件内执行代码过多就可以拿到策略模式来做
- 算法需要自由切换的场景。
这个比较好理解,指的是具体用那种策略是根据入参来决定的
- 需要屏蔽算法规则的场景。