ホームページ >バックエンド開発 >PHPチュートリアル >PHP ステートモードプログラミング

PHP ステートモードプログラミング

*文
*文オリジナル
2017-12-27 14:17:141603ブラウズ

PHP 状態パターン プログラミングとは何ですか?この記事ではチームコラボレーションプログラミングに役立つPHPのステートモードプログラミングを中心に詳しく紹介しますので、皆様のお役に立てれば幸いです。

定義
状態パターン、状態のオブジェクトのパターンとも呼ばれる、状態パターンはオブジェクトの動作パターンです。状態パターンを使用すると、内部状態が変化したときにオブジェクトの動作を変更できます。このオブジェクトはクラスを変更したように見えます

UML 図

2015811162847657.jpg (454×146)

状態パターンの主な役割
抽象状態の役割 (State): 環境をカプセル化するインターフェースまたは抽象クラスの状態を定義します。
ConcreteState ロール: 各状態クラスは、環境 (コンテキスト) の状態に対応する動作を実装します。
環境 (コンテキスト) ロール: クライアントが関心のあるインターフェイスを定義し、インスタンスを保持します。具象状態クラス。この特定の状態クラスのインスタンスは、この環境オブジェクトの現在の状態を示します


使用シナリオ
同じユーザーが繰り返し投票する場合、同じユーザーが投票できるのは 1 つだけであるオンライン投票システムのアプリケーションを考えてみましょう。 5 回以上投票すると、悪意のある投票ブラッシングと判断され、8 回以上投票すると、ブラックリストに追加する必要があります

ステートモードを使用して実装するには、まず、ステートのさまざまなステートを定義する必要があります。投票プロセスは、上記の説明に従って、通常の投票、悪意のある投票、ブラックリスト投票の 4 つの状態に大別できます。次に、投票管理オブジェクト(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) 自体のデータを取得する必要があるため、パラメーターの転送がより便利になる可能性があります。
クライアントは通常、環境 (コンテキスト) とのみ対話します。クライアントは、状態オブジェクトを使用して環境 (コンテキスト) を設定できます。設定が完了すると、状態オブジェクトを処理する必要はなくなります。通常、クライアントは実行時の状態維持に責任を負いませんし、その後どの特定の状態処理オブジェクトが使用されるかにも責任を負いません

関連推奨事項:

PHP デザイン パターン シンプル ファクトリ パターン

phpデザインパターンにおけるファクトリーパターンとシングルトンパターンの違い

PHPポリモーフィズムとダイナミックバインディング

以上がPHP ステートモードプログラミングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。