ホームページ  >  記事  >  Java  >  Java 状態設計パターンを使用してオブジェクトの状態遷移を実装する方法

Java 状態設計パターンを使用してオブジェクトの状態遷移を実装する方法

WBOY
WBOY転載
2023-05-13 11:52:15923ブラウズ

はじめに

Java 状態パターン (状態パターン) はオブジェクト指向の設計パターンであり、オブジェクトの状態を独立した状態オブジェクトにカプセル化し、オブジェクトの動作を状態オブジェクトから切り離します。内部状態が変化したときにオブジェクトの動作を変更するパターンです。このパターンは、すべての動作を 1 つのクラスに入れるのではなく、オブジェクトの動作をさまざまな状態オブジェクトにカプセル化します。

Java 状態パターン 一般的な業界は次の 3 つの役割で構成されています:

  • State Interface (State Interface): さまざまな状態の特定のオブジェクトによって実装される、コンテキスト オブジェクトに関連する一連のメソッドを定義します。

    #具体的な状態: 状態インターフェイスを実装し、特定の状態オブジェクトは別の状態の実装です。
  • コンテキスト (コンテキスト) : 複数の状態を持つオブジェクト。コンテキスト オブジェクトは次のことができます。実行時に状態を変更し、その動作を変更します。
  • Java 状態パターンを実装するにはさまざまな方法があることに注意してください。たとえば、状態を実装するにはインターフェイスと抽象クラスを使用します。列挙型を使用して状態などを実装します。具体的な実装方法は、特定のニーズとシナリオによって異なります。
実装

単純なゲームがあるとします。ゲームの主人公はさまざまな操作を実行できます。状態パターンを使用して、このゲームのデザインを実装できます。

状態インターフェイス

public interface State {
    /**
     * 移动
     */
    void move();
    /**
     * 攻击
     */
    void attack();
}

特定の状態

public class IdleState implements State{
    /**
     * 移动
     */
    @Override
    public void move() {
        System.out.println("静止状态下不能移动...");
    }
    /**
     * 攻击
     */
    @Override
    public void attack() {
        System.out.println("静止状态下不能攻击...");
    }
}
public class MoveState implements State{
    /**
     * 移动
     */
    @Override
    public void move() {
        System.out.println("移动中...");
    }
    /**
     * 攻击
     */
    @Override
    public void attack() {
        System.out.println("移动状态下不能攻击...");
    }
}
public class AttackState implements State{
    /**
     * 移动
     */
    @Override
    public void move() {
        System.out.println("攻击状态下不能移动...");
    }
    /**
     * 攻击
     */
    @Override
    public void attack() {
        System.out.println("攻击中...");
    }
}

コンテキスト

public class Context {
    private State state;
    public Context() {
        // 默认静止状态
        this.state = new IdleState();
    }
    public void setState(State state) {
        this.state = state;
    }
    /**
     * 移动
     */
    public void move() {
        state.move();
    }
    /**
     * 攻击
     */
    public void attack() {
        state.attack();
    }
}

Test

public class Demo {
    public static void main(String[] args) {
        // 静止状态
        Context context = new Context();
        context.move();
        context.attack();
        // 移动状态
        context.setState(new MoveState());
        context.move();
        context.attack();
        // 攻击状态
        context.setState(new AttackState());
        context.move();
        context.attack();
    }
}

上記の例では、最初に State インターフェイスを定義し、次に 3 つの特定の状態クラス IdleState 、 MoveState 、および AttackState を定義し、それぞれ主人公のアイドル状態を表します。移動状態と攻撃状態。これらの状態はすべて State インターフェイスを実装します。次に、現在の状態を表す State オブジェクトを含むコンテキスト Context を定義します。Context クラスで、状態を変更するための setState メソッドを定義します。対応する操作を実行するための攻撃メソッド。Java 状態設計パターンを使用してオブジェクトの状態遷移を実装する方法

概要

利点

状態モードを使用すると、状態を簡単に追加できます。新しい状態クラスを追加するだけです。 .
  • #状態モードは、状態遷移ロジックを状態ク​​ラスにカプセル化することによってオブジェクトの状態を作成します。変更はより明瞭で明確です。

  • 状態モードを使用すると、状態の切り替えが簡単になります。オブジェクトの状態遷移メソッドを呼び出すだけです。

  • 欠点

状態モードにより、次のような問題が発生します。システム内のクラスの数が増加し、コードがますます複雑になります。

  • 状態モードにより状態の切り替えが発生する可能性があります。プロセスが複雑になります。

  • # #アプリケーション シナリオ

オブジェクトの動作がその状態に依存し、実行時に状態が変化する可能性がある場合、状態パターンが適切な選択です。

  • 状態パターンは、オブジェクトがその状態に基づいてさまざまな操作を実行する必要がある場合に非常に役立ちます。

  • オブジェクトに新しい動作を動的に追加する必要がある場合、状態パターンは良い選択です。

  • 一般的なアプリケーション シナリオには、注文ステータス、ユーザー ログイン ステータス、ゲーム ステータスなどが含まれます。

以上がJava 状態設計パターンを使用してオブジェクトの状態遷移を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。