> **設計模式-策略模式**
## 說明 ##
**策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化,即封裝變化的算法。**
----------
##模式說明##
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