PHP面向對象編程設計模式(一)策略模式


(一)什麼是面向對象編程


  面向對象(OO)的定義是什麼,在面向對象的入門課程C++(或者JAVA)中,封裝數據和方法好像是面向對象最重要的一個特點,當然還有基於繼承實現的多態和重載。其實每一種OOP語言,由於彼此功能上的差異性,這些特點隻能適用於某一種特定的任務。

  比較公認的一點是,開發面向對象的軟件不僅要註重語言和語法特性,設計思想也是尤其重要的一點。相對於面向過程的語言,面向對象的語言更容易有優秀的設計思想(參考社區中話題),由於面向對象的各種特性,使其更容易實現出較為復雜、考慮情況更為多樣的的程序。

  同樣,在PHP開發者中,比較常用的面向對象的設計有幾種設計模式,今天我們來全面地瞭解一下這些模式,有的人可能會說我不需要瞭解這些設計模式,也可以寫出優秀的面向對象作品。的確是這樣,但是瞭解這些更容易讓你在面對某種需求時確定出更高效的設計方案,並便於團隊交流。


(二)策略模式 Strategy Pattern


介紹


當幾個類的目的相同,隻是表現方式不同時,采用策略模式,運行時動態選擇所要執行的策略。

策略模式主要是用於多個算法之間的互換,比如在購物網站用戶登陸場景中決定登陸後跳轉到普通用戶界面還是商傢界面。


實現方式


聲明一個抽象的擁有一個算法方法的基類,通過繼承這個基類的具體實現的類來實現策略模式。從而把那些經常變化的部分,從當前的類中單獨取出來,用接口進行單獨的封裝。封裝好瞭接口後,通過指定不同的接口實現類進行算法的變化。


角色分析



  • 抽象策略角色(Strategy):策略類,通常由一個接口或者抽象類實現。

  • 具體策略角色(ConcreteStrategy):包裝瞭相關的算法和行為。

  • 環境角色(Context):持有一個策略類的引用,最終給客戶端調用。


場景


當需要在不同的情況下使用不同的策略,可以使用策略模式,這樣將變化的算法的實現細節對客戶隱藏。但客戶必須知道所有的策略,才能指定在實例化時使用哪一個類。


例子


用戶登陸後,根據id決定跳轉到具體頁面。


    <?php
/**
* 抽象策略角色
*/
class LoginStrategy{

abstract function toLogin();
}
/**
* 具體策略角色
*/
class UserLoginStrategy extends LoginStrategy{

function toLogin(){
echo "go to user";
}
}
/**
* 具體策略角色
*/
class SellerLoginStrategy extends LoginStrategy{
function toLogin(){
echo "go to seller";
}
}
/**
* 環境角色
*/
class contextStrategy{

function login($id){
if ($condition) {
$Login = new UserLoginStrategy;
}else{
$Login = new SellerLoginStrategy;
}
}
$Login->toLogin();
}

?>



策略模式經常和工廠模式一起使用,由工廠模式來選擇一個合適的策略。

0 個評論

要回覆文章請先登錄註冊