在策略模式(Strategy Pattern)中,一个类的行为或其算法能够在运行时更改。这种类型的设计模式属于行为型模式。其实现原理是定义一系列的算法,将他们一个个封装起来,而且是他们能够互相替换,这样避免了使用 if … else 语句所带来的复杂度和维护成。若是一个系统里有许多的类,而这些类之间的区别仅在于它们行为的不一样,系统也须要动态的选择几种算法中的一种,这时使用策略模式是一种很好的解决方案。php
下面的示例演示两个数之间的“加减乘除”运算,在工厂模式一节中,咱们使用的是工厂模式实现这种计算,其是根据传入的不一样参数分别生成不一样的类实例。而本次示例使用策略模式来实现这种数学运算。代码以下:算法
<?php //定义接口 interface Calc{ public function getValue($num1,$num2); } //四个类表示四种可供选择的策略 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 。设计模式
咱们使用策略模式和工厂模式都实现了这种功能,二者的区别是,工厂模式关注对象的建立,提供建立对象的接口,它是建立型的设计模式,它接受指令,建立出符合要求的实例;而策略模式是行为型的设计模式,它接受已经建立好的实例,实现不一样的行为。浏览器
本文节选自 《php7实践指南》 陈小龙著微信
微信扫一扫,发现更多内容php7