1.概念
策略模式:將一組特定的行為和演算法封裝成類,以適應某些特定的上下文環境,這種模式就是策略模式 2.功能
使用原則模式實現Ioc, 依賴倒置, 控制反轉 3.舉例
假如一個電商網站系統,針對不同的人群要跳轉到不同的商品類目,並且所有廣告位展示不同的廣告 4.要解決的問題
1.不會因為內容相關的改變而改變代碼(傳統都是使用 if else 來判斷)
2.如果新增加一種類型的使用者,只需要增加一種策略就好了,不需要在代碼中 if else 裡面在繼續添加邏輯
3.不同的地方只需要執行不同的策略就好了,這樣即可解決問題
4.從寫入程式碼到解耦的使用
5.最主要的是解決了程式中的分支邏輯 5.實戰代碼展示 5.1 聲明策略的介面檔案
interface UserStrategy { function showAd(); function showCategory();}
5.2定義女性使用者的策略
class FemaleUserStrategy implements UserStrategy { function showAd() { echo "2014新款女裝"; } function showCategory() { echo "服裝"; }}
5.3定義男性使用者的策略
class MaleUserStrategy implements UserStrategy { function showAd() { echo "IPhone6"; } function showCategory() { echo "電子產品"; }}
6. 頁面展示與使用
class Page{ //儲存策略對象 protected $strategy; //首頁資訊輸出 function index(){ //傳統寫法,與輸出 if (isset($_GET['famale'])) { echo '女性'; }else if (isset($_GET['famale'])) { echo '男性'; } //如果新增了商務邏輯後面會很多的 if else //策略模式的輸出 echo $this->strategy->showAd(); echo '<br>'; echo $this->strategy->showCategory(); } //策略模式來解決,註冊策略 function setStrategy(UserStrategy $strategy){ $this->strategy = $strategy; }}//執行$page = new Page;//這雷根據實際內容相關的環境if (isset($_GET['famale'])) { $strategy = new FemaleUserStrategy();}else if (isset($_GET['male'])) { $strategy = new MaleUserStrategy();}//使依賴關係反轉,最終執行在使用關係綁定,輸出結果(解決了傳統寫法的耦合問題)$page->setStrategy($strategy);$page->index();