策略模式
定义一组算法,将每个算法封装起来,使它们之间可以互换,此模式让算法可以独立于使用它的用户而变化,用于分离算法,选择实现
多方案切换
核心概念
- Strategy 策略接口
- ConcreteStrategy 具体的策略实现
- Context 上下文,负责和具体的策略类交互
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
public interface Strategy { void algorithms(); }
public class ConcreteStrategyA implements Strategy{ @Override public void algorithms() { System.out.println("ConcreteStrategyA"); } }
public class ConcreteStrategyB implements Strategy{ @Override public void algorithms() { System.out.println("ConcreteStrategyB"); } }
public class Context { private Strategy strategy;
public Context(Strategy strategy){ this.strategy = strategy; }
public void contextInterface(){ strategy.algorithms(); } }
|
优缺点
优点
- 策略类实现自同一个抽象,所以策略类之间可以自由切换
- 易于扩展,增加一个新的策略比较简单
缺点
- 策略类过多不容易维护
- 必须对客户端暴露所有的策略类,使用哪种策略是由客户端来决定的
使用场景
- 同个算法,在很多不同的实现的情况下,可以使用策略模式
- 许多相关的类,仅仅是行为有差别的情况,可以使用策略模式
- 有一个定义了很多行为的类,并且是通过多个if-else来选择这些行为的情况下,可以使用策略模式