設計模式之策略模式

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

圖片描述