1。概要
システム内にオブジェクトに複数の状態がある場合、状態はそれらの間で変換でき、オブジェクトは異なる状態で異なる動作をします。状態モードは、オブジェクトの状態をオブジェクトから分離し、それを特別な状態クラスにカプセル化して、オブジェクト状態を柔軟に変更できるようにします。状態モードはオブジェクトの動作モードです。
2。適用可能なシナリオ
システム内の複雑なオブジェクトの複数の状態遷移のカプセル化問題を解決するために使用され、異なる状態での動作。簡単に言えば、それはオブジェクトの複数の状態とそれらの相互変換に対処することです。
iii。 UMLクラス図
4。参加者
1)、AbstractState(要約状態クラス):
抽象的な状態クラスは、さまざまな状態の下で行動抽象メソッドを定義し、異なる行動操作がサブクラス(異なる状態サブクラス)に実装されています。
2)concreTestate(特定の状態で行動を実装する州のサブクラス):
抽象的な状態クラスのサブクラス、各サブクラスは、環境クラス(コンテキスト)の状態に関連する動作を実装します。特定の各状態クラスは、環境の特定の状態に対応し、異なる特定の状態の動作は異なります。
3)コンテキスト(状態オブジェクトを所有する環境クラス):
環境の多様性により、状態の属性があるため、異なる状態を持ち、異なる状態で異なる動作をする可能性があります。環境クラスで抽象的な状態インスタンスを維持します。このインスタンスは、現在の環境(SetState()メソッド)の状態を定義し、特定の状態の動作を分離し、異なる状態サブクラスによって完了します。
5.ユースケース学習
1。要約状態クラス:state.java
/ *** javaデザインパターンの状態モード*抽象状態クラス* @author [email protected]**/ public abstract class state {/ ***状態行動抽象的方法、特定の状態サブクラスは異なる動作ロジックを実装します*/ public abstract void行動(); }
2。特定の状態サブクラスA:concretestatatea.java
/ ** *特定のステータスサブクラスa * @author [email protected] */ public concretestateaはstate {@override public void行動(){//状態Aのビジネス行動を拡張します。 支払い"); }}
3.特定の状態サブクラスB:concretestateb.java
/ ** *特定の状態のサブクラスB * @Author [email protected] * */ public concreteStatebはstate {@override public void Behavior(){//状態Bのビジネス行動を拡張します。呼び出し "); }}
4。状態オブジェクトを備えた環境クラス:Context.java
/**環境/コンテキストクラス<br/> *状態オブジェクトがあり、状態間の移行を完了することができます[環境クラスで状態の変更/切り替えは実装されています] * @author [email protected] */public class Context {//抽象的な状態オブジェクトの参照を維持します。 / * *携帯電話の電話料金属性<br/> *環境状態は次のとおりです。 * 1>、bill> = 0.00 $:状態が正常な場合、電話をかけることができます。 /***環境処理関数、状態インスタンスの動作を呼び出します。ビジネスロジック<br/>*異なる状態のさまざまな動作への参照*/public void handle(){checkState(); state.behavior(); }/***環境状態を確認します。状態の変更/スイッチングは環境クラスに実装されています*/private void checkState(){if(bill> = 0.00){setState(new ConcreTeStatea()); } else {setState(new ConcretestateB()); }}/** *環境状態を設定します<br/> *プライベート方法、目的は環境の状態をシステム環境自体によって制御/切り替えることです。外部ユーザーは環境内の状態を気にする必要はありません * @param State */private void setState(State State){this.State = state; } public double getBill(){return bill; } public void setbill(double bill){this.bill = bill; }}
5.クライアント呼び出しクラスをテスト:client.java
public class client {public static void main(string [] args){context context = new Context(); Context.SetBill(5.50); System.out.println( "現在のコール料金残高:" + context.getBill() + "$"); context.handle(); Context.SetBill(-1.50); System.out.println( "現在のコール料金残高:" + context.getBill() + "$"); context.handle(); Context.SetBill(50.00); System.out.println( "現在のコール料金残高:" + context.getBill() + "$"); context.handle(); }} 6。プログラム操作結果:
現在のコール料金残高:5.5 $
現在の電話請求書の残高は、頭金のために電話がダウンしていないときに通常行うことができます:-1.5 $
現在の電話料金の残高は、電話が使用されていないときに電話をかけることは許可されていません。
電話は頭金なしで正常に電話をかけることができます
vi。拡大する
状態モードでの状態スイッチングの2つの異なる実装があります
方法1:状態の変更/切り替えは、環境クラスに実装されています。上記のユースケースコードのように、コンテキストクラスのCheckState()メソッド。
/***環境状態を確認します。状態の変更/スイッチングは環境クラスに実装されます*/private void checkState(){if(bill> = 0.00){setState(new Concretestatea()); } else {setState(new ConcretestateB()); }}方法2:状態の変更/切り替えは、特定の状態サブクラスに実装されます。
実装手順は次のとおりです。
1)環境クラスのコンテキストクラスの状態インスタンスオブジェクトを初期化し、サブクラス状態のコンストラクターパラメーターとして環境コンテキストオブジェクトを特定の状態サブクラスインスタンスに渡します。
たとえば、Context.javaクラスで
//初期状態this.state = new concretestatea(this)を設定します。
2)特定のサブクラス状態クラスでは、構築されたコンテキストオブジェクトによると、ビジネスロジックはコンテキストオブジェクトのプロパティ値を呼び出すことによりステータスを判断します。
たとえば、concretestatea.javaクラスでは、特定の状態サブクラス:
/ ** *特定の状態サブクラスa * @author [email protected] */ public class concretestatea extends state {private context ctx; public ConcreteStatea(コンテキストコンテキスト){ctx = context; } @Override public void Behavior(){// State Aのビジネス行動、およびこの状態にあるときに何ができるか//:携帯電話は、頭金System.out.out.Outのためにダウンしていないときに通常通話をすることができます。 CheckState(); }/** *状態を変換する必要があるかどうかを確認します<br/> *状態の切り替えが特定の状態のサブクラスに実装されている */private void checkState(){if(ctx.getBill()<0.00){ctx.setState(new ConcreteStateB(ctx)); }}}
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。