前の記事「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(); } }
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(); } }
$c = new Context(); $stateA = new ConcreteStateA(); $c->SetState($stateA); $c->Request(); $c->Request(); $c->Request(); $c->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
Description<?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;ログイン後にコピー状態モードを使用しない場合Member のdiscount()メソッドでは、if...else...の判定条件を何層も記述する必要がある場合があります
同時に、メソッドのエクスペリエンスが低下するという問題も発生します。
- この問題を解決するために、state モードが存在します。
- discount() 動作の結果がステータスに依存する場合Member オブジェクト自体 (メンバーシップ ポイント) の場合、状態モードが最良の選択です。つまり、上記のオブジェクトの動作はその状態に依存します
- 元のアドレス: https:/ /juejin.cn/post/6844903991562731534
著者: ハードコア プロジェクト マネージャー推奨学習: 「PHP ビデオ チュートリアル 」
以上がPHPの状態パターンとは何ですか?例を通して学びましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。