Strategy
策略模式:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户端。
当我们出去旅游的时候,出行方式很多,如飞机、火车、轮船等等,这些不同的交通方式,其实就是一个个不同的算法,我们可以根据不同的场合选择不同的交通方式。在程序中也就是根据不同的场景,选择不同的算法。这就是策略模式。再比如我们要对一组数据进行排序处理时,可排序的算法有很多,如冒泡排序、选择排序、插入排序等等,也许我们在不同的时候会根据特殊的情况考虑算法的时间复杂度、空间复杂度对当前运行的影响,从而选择使用不同的算法,这也是策略模式想到达的目地:动态的替换策略算法,而不影响原有逻辑。UML图如下:
3-1Q116103K1205.gif

1、场景描述

就利用上面举出的旅游的例子,根据场景动态选择出行方式。利用策略模式来实现。

2、实现

  1. /// <summary>
  2. /// 策略抽象
  3. /// 出行方式策略
  4. /// </summary>
  5. public interface IStrategy
  6. {
  7. /// <summary>
  8. /// 出发
  9. /// </summary>
  10. void StartOff();
  11. }
  12. /// <summary>
  13. /// 策略--飞机旅行
  14. /// </summary>
  15. public class AirplaneStrategy : IStrategy
  16. {
  17. public void StartOff()
  18. {
  19. Console.WriteLine("乘坐飞机旅行...");
  20. }
  21. }
  22. /// <summary>
  23. /// 策略--火车旅行
  24. /// </summary>
  25. public class TrainStrategy : IStrategy
  26. {
  27. public void StartOff()
  28. {
  29. Console.WriteLine("乘坐火车旅行...");
  30. }
  31. }
  32. /// <summary>
  33. /// 旅游
  34. /// </summary>
  35. public class Travel
  36. {
  37. private IStrategy _strategy;
  38. public Travel(IStrategy strategy)
  39. {
  40. this._strategy = strategy;
  41. }
  42. /// <summary>
  43. /// 出发
  44. /// </summary>
  45. public void Depart()
  46. {
  47. Console.WriteLine("准备出发旅行");
  48. if (_strategy != null)
  49. _strategy.StartOff();
  50. }
  51. }
  52. // 客户端调用
  53. IStrategy airplane = new AirplaneStrategy();
  54. Travel travel1 = new Travel(airplane);
  55. travel1.Depart();
  56. Console.WriteLine("*************************");
  57. IStrategy train = new TrainStrategy();
  58. Travel travel2 = new Travel(train);
  59. travel2.Depart();

3、优缺点

优点:

  • 客户端根据不同情况,随时更换“策略”,灵活度高
  • 扩展新功能,仅增加新的策越算法即可,对现有功能无需更改,扩展型强,便于维护

缺点:

  • 对于算法的选择,前提是必须了解这些算法的差异

    4、应用场景

    当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能的情况下,就可以考虑使用策略模式。