首頁  >  文章  >  後端開發  >  PHP狀態模式編程

PHP狀態模式編程

*文
*文原創
2017-12-27 14:17:141575瀏覽

什麼是PHP狀態模式程式設計?本文主要介紹了詳解PHP中的狀態模式編程,有利於團隊協作編程,希望對大家有幫助。

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

UML圖

2015811162847657.jpg (454×146)

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


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

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

UML圖


2015811165624664.jpg (467×164)

範例程式碼

 


 <?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多態與動態綁定

#

以上是PHP狀態模式編程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn