• 第二章 商场促销 --- 策略模式

    第二章 商场促销 --- 策略模式

    1.策略模式

    1. <?php
    2. /**
    3. * abstract class
    4. */
    5. abstract class Strategy
    6. {
    7. // 算法方法
    8. abstract public function AlgorithmInterface();
    9. }
    10. /**
    11. * 算法a
    12. */
    13. class ConcreteStrategyA extends Strategy
    14. {
    15. public function AlgorithmInterface()
    16. {
    17. echo "算法a实现\n";
    18. }
    19. }
    20. /**
    21. * 算法b
    22. */
    23. class ConcreteStrategyB extends Strategy
    24. {
    25. public function AlgorithmInterface()
    26. {
    27. echo "算法b实现\n";
    28. }
    29. }
    30. /**
    31. * 算法c
    32. */
    33. class ConcreteStrategyC extends Strategy
    34. {
    35. public function AlgorithmInterface()
    36. {
    37. echo "算法c实现\n";
    38. }
    39. }
    40. /**
    41. * 上下文context
    42. */
    43. class Context
    44. {
    45. private $strategy;
    46. function __construct($strategy)
    47. {
    48. $this->strategy = $strategy;
    49. }
    50. public function contextInterface()
    51. {
    52. $this->strategy->AlgorithmInterface();
    53. }
    54. }
    55. $context = new Context(new ConcreteStrategyA());
    56. $context->contextInterface();
    57. $context = new Context(new ConcreteStrategyB());
    58. $context->contextInterface();
    59. $context = new Context(new ConcreteStrategyC());
    60. $context->contextInterface();

    2.策略模式和简单工厂结合

    1. <?php
    2. // 只需要修改上方的Context类
    3. class Context
    4. {
    5. private $strategy;
    6. function __construct($operation)
    7. {
    8. switch ($operation) {
    9. case 'a':
    10. $this->strategy = new ConcreteStrategyA();
    11. break;
    12. case 'b':
    13. $this->strategy = new ConcreteStrategyB();
    14. break;
    15. case 'c':
    16. $this->strategy = new ConcreteStrategyC();
    17. break;
    18. }
    19. }
    20. public function contextInterface()
    21. {
    22. return $this->strategy->AlgorithmInterface();
    23. }
    24. }
    25. //客户端代码
    26. $context = new Context('a');
    27. $context->contextInterface();

    总结:

    面向对象的编程,并不是类越多越好,类的划分为了封装,但分类的基础是抽象,具有相同属性和功能的对象集合才是类。

    策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

    策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中公共功能。

    策略模式简化了单元测试,因为每个算法都有自己的类,可以通自己接口单独测试。

    当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为。将这些行为封装在一个个Strategy类中,可以在使用这些行为的类中消除条件语句。

    策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

    在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。

    上一章:第一章 代码无错就是优 ---简单工厂模式

    下一章:第三章 拍摄UFO --- 单一职责原则