策略模式:定義一系列的演算法,把每一個演算法封裝起來, 並且使它們可相互替換。本模式使得演算法可獨立於使用它的客戶而變化。策略模式把對象本身和運算規則區分開來,其功能非常強大,因為這個設計模式本身的核心思想就是物件導向編程的多型的思想。
也就是我們打算出行旅遊,我們可以有幾個策略可以考慮,可以騎單車,汽車,做火車,飛機。
【策略模式中主要角色】
環境類(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