1. 程式人生 > >PHP面向物件程式設計設計模式(一)策略模式

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(); } ?>

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

相關推薦

PHP面向物件程式設計設計模式策略模式

(一)什麼是面向物件程式設計   面向物件(OO)的定義是什麼,在面向物件的入門課程C++(或者JAVA)中,封裝資料和方法好像是面向物件最重要的一個特點,當然還有基於繼承實現的多型和過載。其實每一種OOP語言,由於彼此功能上的差異性,這些特點只能適用於某一種

PHP面向介面程式設計瞭解下

咱這裡先宣告下,面向介面程式設計並不是一種新的程式設計正規化,咱這裡說的是狹義的介面,也就是interface關鍵字。之後,咱們就先來看下介面的作用。 介面,主要是定義一套規範,來描述一個“物”的功能,要求如果現實中的“物”想成為可用的,就必須實現某些基本功能。可以這麼理解:對於實現介面的所

JAVA面向物件程式設計基礎複習面向物件基本概念

從今天開始有計劃的寫一些博文。內容主要涉及JAVA語言、面向物件程式設計、設計模式、android開發(這才是重點嘛)。今天開始寫 JAVA面向物件程式設計基礎複習這個系列的文章。 JAVA面向物件程式設計基礎複習目錄      (二)異常處理與自定義異常      (

設計模式策略模式和狀態模式

今天要和大家一起分享下在《Head First 設計模式》學習到的內容,很實用的兩個模式:策略模式,狀態模式。 為什麼要說這兩個模式呢。在模式圖中,是一樣的,他倆就像孿生兄弟,但是目的卻不同。 狀態模式: 書中說明了列舉了下面情況。 糖果公司要求實現糖果機功能。狀態圖如下。

設計模式 策略模式

概述 策略模式算是設計模式中比較好理解的,其實就是在執行期間動態的修改一個抽象類的具體實現,從而實現了每個具體類的不同的"策略"。 組成 —抽象策略角色: 策略類,通常由一個介面或者抽象類實現。 —具體策略角色:包裝了相關的演算法和行為。 —環境角色:持有一個策略類

Java面向物件設計模式十三——策略模式strategy

策略模式(strategy) 策略模式定義了一系列演算法,並將每個演算法封裝起來,使他們可以相互替換,且演算法的變化不會影響到使用演算法的客戶。         一種方法是 需要設計一個介面,為

php面向對象編程

沒有 block 可能 一道 ces 描述 pla add 實例 類與對象關系: 類就像一個人類的群體 我們從類中實例化一個對象 就像是制定一個人。 面向對象程序的單位就是對象,但對象又是通過類的實例化出來的,所以我們首先要做的就是如何來聲明類, 做出來一個類很容

設計模式——命令模式

進行 span request st2 ges 耦合 i++ 設計 ima 1.描述 將一個請求封裝為一個對象,從而使用戶可以用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可撤銷操作。 2.用途 在程序設計中,經常涉及道一個對象請求另一個對象調用其方法的情

設計模式工廠模式

inside 類和對象 ace square 種類型 創建 實體類 需要 服務器 工廠模式 工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。 在工廠模式中,我們在創建對象時不會

面向對象設計思想

結構化數據 寄存器 Language 事物 屏蔽 程序 提高 ram languages 編程語言的發展 1.機器語言——直接由計算機的指令組成,指令,數據,地址都以“0”和“1”的符合串組成;可以被計算機直接執行。2.匯編語言——用容易和記憶的的符號表示指令、數據以及寄存

第2章 面向物件設計原則SOLID:6_開閉原則

6. 開閉原則(Open Closed Principle,OCP) 6.1 定義 (1)一個類應該對擴充套件開放,對修改關閉。要求通過擴充套件來實現變化,而且是在不修改己有的程式碼情況下進行擴充套件,也不必改動己有的原始碼或二進位制程式碼。 (2)在軟體生命週期內,變化是一個既定的事實

第2章 面向物件設計原則SOLID:5_迪米特法則

5. 迪米特法則(Law of Demeter,LoD) 5.1 定義 (1)應儘量減少其他物件之間的互動,物件只和自己的朋友交談,即對其他依賴的類越少越好(不要和太多的類發生關係)。 (2)儘量不要讓類和類之間建立直接的關係,這樣可減少類與類之間的依賴,降低類之間的耦合。 (3)一

第2章 面向物件設計原則SOLID:4_介面隔離原則ISP

4. 介面隔離原則(Interface Segregation Principle,ISP) 4.1 定義 (1)使用多個專門的介面,而不使用單一的總介面,即客戶端不應該依賴那些它不需要的介面。類間的依賴關係應該建立在最小介面上 (2)介面儘量細化,同時介面中的方法儘量少。每個介面中只包

第2章 面向物件設計原則SOLID:3_依賴倒置原則DIP

3. 依賴倒置原則(Dependence Inversion Principle,DIP) 3.1 定義 (1)要依賴抽象,不要依賴具體的實現類。簡單的說就是對抽象(或介面)進行程式設計,不要依賴實現進行程式設計,這樣就降低了客戶與實現模組間的耦合。包含3層含義:   ①高層模組不應依賴

第2章 面向物件設計原則SOLID:2_里氏替換原則LSP

2. 里氏替換原則(Liskov Substitution Principle,LSP) 2.1 定義 (1)所有使用基類的地方必須能透明地使用子類替換,而程式的行為沒有任何變化(不會產生執行結果錯誤或異常)。只有這樣,父類才能被真正複用,而且子類也能夠在父類的基礎上增加新的行為。也只有這樣

第2章 面向物件設計原則SOLID:1_單一職責原則SRP

1. 單一職責原則(Single Responsibility Principle,SRP) 1.1 單一職責的定義 (1)定義:一個類應該僅有一個引起它變化的原因。這裡變化的原因就是所說的“職責”。 (2)如果一個類有多個引起它變化的原因,也就意味著這個類有多個職責。即把多個職責耦合在

PHP面向介面程式設計瞭解下

通過上篇文章呢,我們對於這個面向介面程式設計有了一個基本的認知,完事這次,我們主要是來簡單延伸下我們的思維模式。 我們知道,PHP是弱型別語言,而且呼叫比較靈活,所以本人並不推薦大規模使用介面,可以在部分‘核心’程式碼中使用介面。 並且呢,因為PHP中的介面已經失去了很多介面本應該具有的

PHP設計模式3—— 策略模式

基本概念 策略模式是一個非常常用,且非常有用的設計模式。 簡單的說,它是當你使用大量if else邏輯時的救星。 if else 就是一種判斷上下文的環境所作出的策略,如果你把if else寫死,那麼在複雜邏輯的時候你會發現程式碼超級長,而且最蛋疼的是,當你以後要新增策略時

Java設計模式工廠模式

目錄 1、工廠模式簡介 2、工廠模式分類 2.1 簡單工廠模式 2.2 工廠方法模式 2.3 抽象工廠模式 1、工廠模式簡介 工廠模式(Factory Pattern)是 Java 中最常用的設計模式之

C++ 面向物件- -運算子的過載

  運算子過載的方法 運算子過載的方法就是定義一個過載運算子的函式,使指定的運算子不僅能實現原有的功能,還能實現在函式中指定的新加的功能。在使用被過載的運算子時,系統就會自動呼叫該函式,以實現相應的功能,也就是說,運算子的過載是通過定義函式實現的。運算子的過載實質上就是函式的過載。