> **设计模式-策略模式**
## 说明 ##
**策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化,即封装变化的算法。**
----------
##模式说明##
1.多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为。
2.需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3.对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
4.客户端必须知道所有的策略类,并自行决定使用哪一个策略类,策略模式只适用于客户端知道所有的算法或行为
![https://blog.zxliu.cn/usr/uploads/2020/11/2092914566.png][1]
##代码示例##
<?php
/**
* 策略模式示例
* 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化,即封装变化的算法。
*/
header('Content-Type: text/plain');
/**
* 简单计算器接口
* Interface Math
*/
interface Math{
public function calc($op1,$op2);
}
class MathAdd implements Math{
public function calc($op1, $op2)
{
return $op1+$op2;
}
}
class MathSub implements Math{
public function calc($op1, $op2)
{
return $op1-$op2;
}
}
class MathMul implements Math{
public function calc($op1, $op2)
{
return $op1*$op2;
}
}
class MathDiv implements Math{
public function calc($op1, $op2)
{
if($op2==0){
throw new Exception("除数不能为0");
}
return $op1/$op2;
}
}
//封装虚拟计算器
Class CMath{
protected $objCalc=null;
public function __construct($thpe)
{
$cale="Math" . $thpe;
$this->objCalc= new $cale();
}
public function calc($op1,$op2){
return $this->objCalc->calc($op1,$op2);
}
}
echo "计算10跟5的加减乘除运算".PHP_EOL.PHP_EOL;
$objMath = new CMath('Add');
echo "加法运算".PHP_EOL;
echo "结果:".$objMath->calc(10,5).PHP_EOL;
$objMath = new CMath('Sub');
echo "减法运算".PHP_EOL;
echo "结果:".$objMath->calc(10,5).PHP_EOL;
$objMath = new CMath('Mul');
echo "乘法运算".PHP_EOL;
echo "结果:".$objMath->calc(10,5).PHP_EOL;
$objMath = new CMath('div');
echo "除法运算".PHP_EOL;
echo "结果:".$objMath->calc(10,5).PHP_EOL;
----------
结果:
计算10跟5的加减乘除运算
加法运算
结果:15
减法运算
结果:5
乘法运算
结果:50
除法运算
结果:2
##策略模式跟工厂模式的区别##
工厂相关的模式属于创建型模式,顾名思义,这种模式是用来创建对象的,返回的是new出来的对象。要调用对象的什么方法是由客户端来决定的。
而策略模式属性行为型模式,注重策略的执行,将要调用的函数方法封装了起来,客户端只需要调用执行的策略方法就可以了。
## 结尾 ##
<p style="background-image: -webkit-linear-gradient(left, #3498db, #f47920 10%, #d71345 20%, #f7acbc 30%,#ffd400 40%, #3498db 50%, #f47920 60%, #d71345 70%, #f7acbc 80%, #ffd400 90%, #3498db);color: transparent;-webkit-text-fill-color: transparent;-webkit-background-clip: text;text-align:center;">
心如花木,向阳而生。
</p>
[1]: https://blog.zxliu.cn/usr/uploads/2020/11/2092914566.png