什么是策略模式?

提前指定一系列的策略,程序运行时选择性执行的模式叫策略模式。
该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

适用场景

在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。
2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。
3、Spring MVC框架中每个路由可以看成一个策略

代码实现

策略模式的主要角色如下。

  1. 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
  2. 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
  3. 环境(Context)类:持有一个策略类的引用,最终给客户端调用。
  1. /**
  2. * 抽象策略类
  3. */
  4. interface Strategy {
  5. //策略方法
  6. void method();
  7. }
  8. /**
  9. * 具体策略类A
  10. */
  11. class ConcreteStrategyA implements Strategy {
  12. @Override
  13. public void method() {
  14. System.out.println("具体策略A的策略方法");
  15. }
  16. }
  17. /**
  18. * 具体策略类B
  19. */
  20. class ConcreteStrategyB implements Strategy {
  21. @Override
  22. public void method() {
  23. System.out.println("具体策略B的策略方法");
  24. }
  25. }
  26. /**
  27. * 上下文 环境类
  28. */
  29. class Context {
  30. private Strategy strategy;
  31. public Strategy getStrategy() {
  32. return strategy;
  33. }
  34. public void setStrategy(Strategy strategy) {
  35. this.strategy = strategy;
  36. }
  37. public void strategyMethod() {
  38. strategy.method();
  39. }
  40. }
  41. /**
  42. * 策略模式 测试类
  43. */
  44. public class StrategyPattern {
  45. public static void main(String[] args) {
  46. //创建上下文
  47. Context context = new Context();
  48. //使用策略A
  49. Strategy strategyA = new ConcreteStrategyA();
  50. context.setStrategy(strategyA);
  51. context.strategyMethod();
  52. //使用策略B
  53. Strategy strategyB = new ConcreteStrategyB();
  54. context.setStrategy(strategyB);
  55. context.strategyMethod();
  56. //输出:
  57. //具体策略A的策略方法
  58. //具体策略B的策略方法
  59. }
  60. }