美文共赏

策略模式

2021-12-12  本文已影响0人  星月落

内容来源(公众号:PHP版WEB项目)在策略模式(Strategy Pattern)中,一个类的行为或算法可以在运行时更改。这种类型的设计模式属于行为型模式,其实现原理是定义一系列的算法,将它们一个个封装起来,并且可以互相替换,这样避免了使用if…else语句所带来的复杂度和维护成本。如果一个系统里有许多的类,而这些类之间的区别仅在于它们行为的不同,系统也需要动态地选择几种算法中的一种,这时使用策略模式是一种很好的解决方案。

下面的示例演示两个数之间的“加减乘除”运算。在工厂模式中,我们使用工厂模式实现了这种计算,根据传入的参数而分别生成不同的类实例。这里的示例使用策略模式来实现这种数学运算,代码如下:

   <?php

  //定义接口

  interface Calc{

   public function getValue($num1,$num2);

  }

  //4个类表示4种可供选择的策略

  class AddStrategy implements Calc {

   public function getValue($m,$n){

    echo $m + $n;

   }

  }

  class SubStrategy implements Calc {

   public function getValue($m,$n){

    echo $m - $n;

   }

  }

  class MulStratygy implements Calc {

   public function getValue($m,$n){

    echo $m * $n;

   }

  }

  class DivStrategy implements Calc {

   public function getValue($m,$n){

    try {

     if($n == 0) {

      throw new Exception("除数不能为0");

     } else {

      echo $m/$n;

     }

     } catch (Exception $e) {

      echo "错误信息:" .$e->getMessage();

    }

   }

  }

  class CalcContext{

   private $_strategy = null;

   public function __construct(Calc $select){

    $this->_strategy = $select;

   }

   //设置使用的策略类

   public function setCalc(Calc $select){

    return $this->_strategy = $select;

   }

   public function calcResult($m,$n){

    $this->_strategy->getValue($m,$n);

   }

  }

  $result = new CalcContext(new AddStrategy());

  $result->calcResult(10,2);

  // 切换不同策略

  $result->setCalc(new DivStrategy());

  $result->calcResult(10,2);

  ?>

执行以上程序,在浏览器中的输出结果为:

12 5

我们使用策略模式和工厂模式都可以实现这种功能,区别是:工厂模式关注对象的创建,提供创建对象的接口,是创建型的设计模式,接受指令,创建出符合要求的实例;策略模式是行为型的设计模式,接受已经创建好的实例,实现不同的行为。

上一篇下一篇

猜你喜欢

热点阅读