PHP狀態模式編程

來源:互聯網
上載者:User
什麼是PHP狀態模式編程?本文主要介紹了詳解PHP中的狀態模式編程,有利於團隊協作編程,希望對大家有所協助。

定義
狀態模式,又稱狀態物件模式(Pattern of Objects for State),狀態模式就是對象的行為模式。狀態模式允許一個對象在其內部狀態改變的時候改變其行為。這個對象看上去就像是改變了它的類一樣

UML圖

狀態模式中主要角色
抽象狀態角色(State):定義一個介面或抽象類別State,用以封裝環境對象的一個特定的狀態所對應的行為
具體狀態(ConcreteState)角色:每一個狀態類都實現了環境(Context)的一個狀態所對應的行為
環境(Context)角色:定義用戶端所感興趣的介面,並且保留一個具體狀態類的執行個體。這個具體狀態類的執行個體給出此環境對象的現有狀態


使用情境
考慮一個線上投票系統的應用,要實現控制同一使用者只能投一票,如果一個使用者反覆投票,而且投票超過5次,則判定為惡意刷票,如果投票超過8次,需要加入黑名單

要使用狀態模式實現,首先要把投票過程的各種狀態定義出來,根據以上描述大致分為四種狀態:正常投票,惡意投票,黑名單投票。然後建立一個投票管理對象(相當於Context)

UML圖


範例程式碼


 <?php  /**   * 抽象狀態類   * @author wzy   *   */  interface VoteState  {   /**    * 需要實現的公用方法    */   public function vote ();  }   /**   * 具體狀態——正常投票   *   * @author wzy   *     */  class NormalVoteState implements VoteState  {   public function vote ()   {    echo "這是一個正常投票!";   }  }  /**   * 具體狀態——惡意投票   *   * @author wzy   *     */  class RepeatVoteState implements VoteState  {   public function vote ()   {    echo "這是一個惡意投票!";   }  }  /**   * 具體狀態——黑名單投票   *   * @author wzy   *     */  class BlockVoteState implements VoteState  {     public function vote ()   {    echo "這是一個黑名單投票!";   }  }    /**   * Context角色   */  class VoteManager  {     /**    * 投票數量    *    * @var int    */   private $vote_count;     /**    * 狀態類執行個體    *    * @var object    */   private $voteInstance;     /**    * 建構函式,初始化成員屬性    *    * @param int $count       */   public function __construct ($count = 1)   {    $this->vote_count = $count;   }     /**    * 用戶端調用的介面函數    */   public function setState ($count)   {    if (! is_null($count)) {     $this->vote_count = $count;    }    if ($this->vote_count < 5) {     $this->voteInstance = new NormalVoteState();    } else     if ($this->vote_count < 8) {      $this->voteInstance = new RepeatVoteState();     } else {      $this->voteInstance = new BlockVoteState();     }        $this->voteInstance->vote();   }  }    /**   * 類比用戶端操作   */    $object = new VoteManager();  $object->setState(1);  echo "<br>";  $object->setState(6);  echo "<br>";  $object->setState(10);


回顧狀態模式
狀態和行為
所謂對象的狀態,通常指的就是對象執行個體的屬性的值;而行為指的就是對象的功能,在具體一點說,行為大多可以對應到方法上

狀態模式的功能就是分離狀態的行為,通過維護狀態的變化,來調用不同狀態對應的功能。也就是說,狀態和行為是相關聯的,它們的關係可以描述為:狀態決定行為

由於狀態是在運行期被改變的,因為行為也會在運行期根據狀態的改變而改變

環境和狀態處理對象
在狀態模式中,環境(Context)是持有狀態的對象,但是環境自己並不處理跟狀態相關的行為,而是把處理狀態的功能委託給了狀態對應的狀態處理類來處理

在具體的狀態處理中經常需要擷取環境(Context)自身的資料,可以考慮用抽象類別替代介面,這樣可能會更方便參數的傳遞

用戶端一般只與環境(Context)互動。用戶端可以用狀態物件來配置一個環境(Context),一旦配置完畢,就不再需要和狀態物件打交道了。用戶端通常不負責運行期間的狀態維護,也不負責後續到底使用哪一個具體的狀態處理對象

相關推薦:

PHP設計模式之簡單原廠模式

php設計模式中原廠模式和單例模式的區別

PHP多態與動態綁定

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.