1. パターン定義
状態パターン (State) は、状態オブジェクト パターンとも呼ばれ、主に、オブジェクトの状態遷移を制御する条件式が過大な場合の状況を解決します。複雑な。状態パターンを使用すると、オブジェクトの内部状態が変化したときにオブジェクトの動作を変更できるようになり、状態判断ロジックをさまざまな表現を表す一連のクラスに転送することで、複雑な論理判断が簡素化されます。
一言で言えば、状態パターンは、研究対象のオブジェクトの動作をさまざまな状態オブジェクトにラップします。各状態オブジェクトは、抽象状態クラスのサブクラスに属します。状態パターンの目的は、オブジェクトの内部状態が変化したときにオブジェクトの動作を変更できるようにすることです。
2. UML クラス図
3. サンプルコード
OrderController.php
1 | <?phpnamespace DesignPatterns\Behavioral\State; class OrderController{ public function shipAction( $id ) { $order = OrderFactory::getOrder( $id ); try { $order ->shipOrder(); } catch (Exception $e ) {
|
ログイン後にコピー
OrderFactory.php
1 | <?phpnamespace DesignPatterns\Behavioral\State; class OrderFactory{ private function __construct() { throw new \Exception( 'Can not instance the OrderFactory class!' ); } public static function getOrder( $id ) {
|
ログイン後にコピー
OrderInterface.php
1 | <?phpnamespace DesignPatterns\Behavioral\State; interface OrderInterface{ public function shipOrder(); public function completeOrder();}
|
ログイン後にコピー
ShippingOrder.php
1 | <?phpnamespace DesignPatterns\Behavioral\State; class ShippingOrder implements OrderInterface{ private $order ; public function __construct( array $order ) { if ( empty ( $order )) { throw new \Exception( 'Order can not be empty!' ); } $this ->order = $order ; } public function shipOrder() {
|
ログイン後にコピー
CreateOrder.php
1 | <?phpnamespace DesignPatterns\Behavioral\State; class CreateOrder implements OrderInterface{ private $order ; public function __construct( array $order ) { if ( empty ( $order )) { throw new \Exception( 'Order can not be empty!' ); } $this ->order = $order ; } public function shipOrder() { $this ->order[ 'status' ] = 'shipping' ; $this ->order[ 'updatedTime' ] = time();
|
ログイン後にコピー
注: code では疑似コードが使用されているため、ここではテストされません。
4. まとめ
ソフトウェア開発プロセスにおいて、アプリケーションは状況に応じて異なる処理を実行することがあります。最も簡単な解決策は、これらすべての事態を考慮に入れることです。次に、if... ellse ステートメントを使用してステータスを判断し、さまざまな状況に対処します。しかし、複雑な国家の判断は「力不足」のようだ。新しい状態の追加や状態の変更 (if else (または switch case) ステートメントの追加や変更) によって大きな変更が生じる可能性があるため、プログラムの可読性やスケーラビリティも非常に弱くなります。メンテナンスも面倒になる場合があります。次に、状態パターンの使用を検討します。
状態パターンの主な利点は、変換ルールをカプセル化し、特定の状態に関連するすべての動作をクラスにまとめ、必要なだけ新しい状態を簡単に追加できることです。オブジェクトの状態を変更してオブジェクトの動作を変更することもできます。また、複数の環境オブジェクトが状態オブジェクトを共有できるようにすることで、システム内のオブジェクトの数を減らすこともできます。その欠点は、状態モードを使用するとシステム クラスの数が増えることです。モードの構造と実装は比較的複雑です。不適切に使用すると、状態を切り替えることができるステート モードは「オープニングとステート」の要件を満たしません。クロージング原則」。