ホームページ >バックエンド開発 >PHPチュートリアル >PHPの状態パターンとは何ですか?例を通して学びましょう
前の記事「PHP のシングルトン モードについて話しましょう」では、PHP のシングルトン モードについて紹介しました。次の記事では、PHP デザイン パターンのステート モードについて説明します。
状態パターンを文字通りに理解するのはそれほど簡単ではありません。ここでのステータスは何を意味するのでしょうか?ステータスを保存しますか?それはメモモードではありません。実際、ここでの状態はクラスの状態であり、クラスの特定の状態を変更すると、そのクラスは別のクラスのように感じられます。少し難しいので、まず概念を学んでから読みましょう。GoF 定義: 内部状態が変化したときにオブジェクトの動作を変更できるようにします。オブジェクトはそのクラスを変更したようです
GoF クラス図
コードの実装
class Context { private $state; public function SetState(State $state): void { $this->state = $state; } public function Request(): void { $this->state = $this->state->Handle(); } }コンテキスト クラスは、内部に状態オブジェクトを持つターゲット クラスとみなすこともできます。 Request()を呼び出す場合は、ステータスクラスのHandle()メソッドを呼び出します。その目的は、現在のコンテキスト クラスの状態の変更が外部状態クラスによって制御されることです。
interface State { public function Handle(): State; } class ConcreteStateA implements State { public function Handle(): State { echo '当前是A状态', PHP_EOL; return new ConcreteStateB(); } } class ConcreteStateB implements State { public function Handle(): State { echo '当前是B状态', PHP_EOL; return new ConcreteStateA(); } }抽象状態インターフェイスと 2 つの具体的な実装。これら 2 つの特定の実装は、実際には相互に呼び出しています。この実装の効果は、コンテキスト クラスが Request() メソッドを呼び出すたびに、内部状態クラスが別の状態に変化することです。オンとオフを行き来するスイッチのようなものです。
$c = new Context(); $stateA = new ConcreteStateA(); $c->SetState($stateA); $c->Request(); $c->Request(); $c->Request(); $c->Request();クライアントの実装は、コンテキスト オブジェクトをインスタンス化して初期状態を設定し、その後、継続的に Request() オブジェクトを呼び出してスイッチ状態の切り替えを実現します。
弊社では独自のショッピングモールシステムを携帯電話システムにカスタマイズしており、携帯電話から簡単にご注文・ご購入いただけます。注文 (Context) には、未払い、支払い済み、注文完了、注文返金など、複数の状態 (State) が含まれます。これらの状態を対応する状態クラスに配置して実装します。異なる状態クラスが状態の次のアクションを呼び出します。たとえば、支払い後は商品の受け取りを待ち、返金後は購入者が記入するのを待ちます。待って、このようにして、ステートモードをモール内で柔軟に使用できるようになります。 !
#完全なコード: https://github.com/zhangyue0503/designpatterns-php/blob/master/22.state/source/state.php##例
メンバー割引の画像
完全なソース コード: https://github.com/zhangyue0503/designpatterns-php / blob/master/22.state/source/state-member.php
<?php class Member { private $state; private $score; public function SetState($state) { $this->state = $state; } public function SetScore($score) { $this->score = $score; } public function GetScore() { return $this->score; } public function discount() { return $this->state->discount($this); } } interface State { public function discount($member); } class PlatinumMemeberState implements State { public function discount($member) { if ($member->GetScore() >= 1000) { return 0.80; } else { $member->SetState(new GoldMemberState()); return $member->discount(); } } } class GoldMemberState implements State { public function discount($member) { if ($member->GetScore() >= 800) { return 0.85; } else { $member->SetState(new SilverMemberState()); return $member->discount(); } } } class SilverMemberState implements State { public function discount($member) { if ($member->GetScore() >= 500) { return 0.90; } else { $member->SetState(new GeneralMemberState()); return $member->discount(); } } } class GeneralMemberState implements State { public function discount($member) { return 0.95; } } $m = new Member(); $m->SetState(new PlatinumMemeberState()); $m->SetScore(1200); echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL; $m->SetScore(990); echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL; $m->SetScore(660); echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL; $m->SetScore(10); echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL;Description
状態モードを使用しない場合Member のdiscount()メソッドでは、if...else...の判定条件を何層も記述する必要がある場合があります
著者: ハードコア プロジェクト マネージャー
推奨学習: 「PHP ビデオ チュートリアル 」
以上がPHPの状態パターンとは何ですか?例を通して学びましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。