多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
> **设计模式-策略模式** ## 说明 ## **策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化,即封装变化的算法。** ---------- ##模式说明## 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