ステート ステート モードは、GOF の 23 モードの 1 つであり、コマンド モードと同様に動作モードでもあります。ステート モードはコマンド モードと非常によく似ており、どちらも「インターフェイス実装クラス」モードの適用であり、インターフェイス指向プログラミング原理の具体化です。
状態パターンは、オブジェクトの内部状態が変化したときにオブジェクトの動作を変更できるようにすることを目的としています。より一般的な例は、ネットワーク接続を表す TCPConnection クラス内にあり、TCPConnection オブジェクトのステータスは、接続が確立された (確立)、待機中、および接続が閉じられた (クローズ) のいずれかの状態になります。 。 TCPConnection オブジェクトが別のオブジェクトから要求を受信すると、自身のステータスに基づいて異なる応答を行います。
例: Open リクエストの結果は、接続が閉じられているか、接続が確立されているかによって異なります。状態モードは、TCPConnection が各状態でどのように異なる動作を示すかを示します。このモデルの重要なアイデアは、ネットワークの接続ステータスを表す TCPState という抽象クラスを導入することです。TCPState クラスは、さまざまな動作状態を表すさまざまなサブクラスのパブリック インターフェイスを宣言します。 TCPState のサブクラスは、特定の状態に関連する動作を実装します。たとえば、TCP確立クラスとTCPClosedクラスは、それぞれTCPConnectionの接続が確立された状態と閉じられた状態に特有の動作を実装します。
たとえば、人には怒り、幸せ、狂気などの状態があり、これらの状態で同じことをすると異なる結果が生じる可能性があり、人の気分はこれら 3 つの状態を循環する可能性があります。人の気分を表すには、moodState クラスを使用し、さまざまな気分を表すには、mad、Happy、および Angry クラスを使用します。
まず例を見てみましょう:
/**
* 状態パターン
*
* 内部状態が変化したときにオブジェクトの動作を変更できるようにし、オブジェクトが属するクラスを変更しているように見せます
*
*/
interface State
{
public function handle ($state);
パブリック関数 display();
クラス コンテキスト
{
private $_state = null;
$this->setState($state);
パブリック関数 setState($ state)
{
$this->_state = $state;
}
パブリック関数 request()
{
$this->_state->display(); ;_state->handle ($this);
}
}
class StateA は State を実装します
{
public function handle($context)
{
$context->setState(new StateB())
}
public function display()
{
echo "state A
";
}
}
class StateB は State を実装します
{
public function handle($context)
{
$context->setState(new StateC( ));
}
public function display()
{
echo "state B
";
}
}
class StateC は State を実装します
{
public function handle($context)
{
$context- >setState(new StateA ());
}
public function display()
{
echo "state C
";
}
}
// インスタンス化
$objContext = new StateB ());
$objContext->request();
$objContext->request();リクエスト();
ステート モードを理解するには、次の 2 つの重要なポイントがあります。
1. 通常、コマンド モード インターフェイスにはメソッドが 1 つだけあります。 ステート モード インターフェイスには 1 つ以上のメソッドがあります。さらに、状態パターン実装クラスのメソッドは通常、値を返すか、インスタンス変数の値を変更します。言い換えれば、状態パターンは一般にオブジェクトの状態に関連しています。実装クラスのメソッドにはさまざまな機能があり、インターフェイス内のメソッドをオーバーライドします。コマンド モードと同様に、ステート モードを使用して、if...else などの条件付き選択ステートメントを削除することもできます。
2. 主な目的は、インスタンス変数としてオブジェクト参照であることです。コマンド モードの主な使用方法は、パラメータ コールバック モードです。コマンド インターフェイスはメソッド パラメータとして渡されます。次に、メソッド本体でインターフェイスをコールバックします。状態モードを使用する主な方法は、インスタンス変数として、属性セット メソッドまたはコンストラクターを通じて状態インターフェイスの特定の実装クラスのインスタンスを渡すことです。したがって、コマンド モードとステータス モードの類似点と相違点は次のように比較できます。
ステート モードとコマンド モードはどちらも非常に一般的に使用され、粒度が比較的小さいモードであり、多くのより大きなモードの一部です。基本的に、ステート モードとコマンド モードは非常に似ています。開発者が単一ケースと複数ケースを明確に理解していれば、2 つのモードに分けなくても問題ありません。
http://www.bkjia.com/PHPjc/323615.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/323615.html技術記事ステート ステート モードは、GOF の 23 モードの 1 つであり、コマンド モードと同様に動作モードです。ステート モードはコマンド モードとよく似ており、「インターフェイス実装クラス」モードでもあります...