程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> 詳解PHP中的狀態模式編程

詳解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),一旦配置完畢,就不再需要和狀態對象打交道了。客戶端通常不負責運行期間的狀態維護,也不負責後續到底使用哪一個具體的狀態處理對象

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved