策略模式:定義一系列的算法,把每一個算法封裝起來, 並且使它們可相互替換。本模式使得算法可獨立於使用它的客戶而變化。策略模式把對象本身和運算規則區分開來,其功能非常強大,因為這個設計模式本身的核心思想就是面向對象編程的多形性的思想。
也就是我們打算出行旅游,我們可以有幾個策略可以考慮,可以騎自行車,汽車,做火車,飛機。
【策略模式中主要角色】
環境類(Context):用一個ConcreteStrategy對象來配置。維護一個對Strategy對象的引用。可定義一個接口來讓Strategy訪問它的數據。(出去旅游(接口類或抽象類)必須考慮交通工具,交通工具要考慮時間(接口類或抽象類要實現的方法),費用等問題)
抽象策略類(Strategy):定義所有支持的算法的公共接口。 Context使用這個接口來調用某ConcreteStrategy定義的算法。(環境類的實現,選擇交通工具范圍,火車,飛機,自行車。。。)
具體策略類(ConcreteStrategy):以Strategy接口實現某具體算法。(給出我們選擇交通方式的信息)
【策略模式PHP示例】
# 環境類(Context)
interface TravelTool{
public function useTime();
public function money();
}
# 抽象策略類(Strategy)
class Plane implements TravelTool { # 飛機
public function useTime()
{
return '1 h';
}
public function money()
{
return '$10';
}
}
class Train implements TravelTool { # 火車
public function useTime()
{
return '3 h';
}
public function money()
{
return '$5';
}
}
# 具體策略類(ConcreteStrategy)
class doTravel{
public $obj;
public function __construct($method)
{
$temp = new ReflectionClass($method); # 看到別的博客用了反射就學習了一下 http://www.php.net/manual/zh/book.reflection.php
$this->obj = $temp->newInstance();
}
public function money(){
echo $this->obj->money();
}
public function useTime(){
echo $this->obj->useTime();
}
}
$obj = new doTravel('Train');
$obj->money();
echo "<br/>";
$obj->useTime();
關於更詳細的內容(優點,缺點,適用性)看這裡 轉載於http://www.howzhi.com/group/php/discuss/3456