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