ホームページ  >  記事  >  バックエンド開発  >  PHPにおける状態パターンの定義と使用法

PHPにおける状態パターンの定義と使用法

墨辰丷
墨辰丷オリジナル
2018-06-07 15:17:511823ブラウズ

この記事では主に PHP におけるステートモードの定義と使い方について紹介します。興味のある方はぜひ参考にしてください。

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

UML 図

2015811162847657.jpg (454×146)

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


使用シナリオ
同じユーザーが 1 つのみキャストできるように制御するオンライン投票システムのアプリケーションを検討します。 vote 、ユーザーが繰り返し投票し、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) 自体のデータを取得する必要があることがよくあります。インターフェイスの代わりに抽象クラスを使用することを検討できます。これは、より便利な場合があります。パラメータの受け渡し

クライアントは、通常、環境 (コンテキスト) とのみ対話します。クライアントは、状態オブジェクトを使用して環境 (コンテキスト) を設定できます。設定が完了すると、状態オブジェクトを処理する必要はなくなります。クライアントは通常、動作中の状態維持については責任を負いません。また、後でどの特定の状態処理オブジェクトが使用されるかについても責任を負いません。

概要

: 上記がこの記事の全内容です。皆さんの学習が役に立てば幸いです。

関連する推奨事項:

php は ftp を使用してファイルのアップロードおよびダウンロード機能を実装します

PHP は配列を実装します重複排除方法の説明

PHP mysqli トランザクション操作で一般的に使用される方法の詳細な説明

以上がPHPにおける状態パターンの定義と使用法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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