设计模式之策略模式

在策略模式(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

图片描述