ステータスモード

16254 ワード

油抜き機

package statepattern;

public class GumballMachine {
    final static int SOLD_OUT = 0;
    final static int NO_QUARTER = 1;
    final static int HAS_QUARTER = 2;
    final static int SOLD = 3;

    int state = SOLD_OUT;
    int count = 0;


    public GumballMachine(int count) {
        this.count = count;
        if (count > 0) {
            state = NO_QUARTER;
        }
    }

    public void insertQuarter() {
        if (state == HAS_QUARTER) {
            System.out.println("One Coin only");
        } else if (state == NO_QUARTER) {
            state = HAS_QUARTER;
        } else if (state == SOLD_OUT) {
            System.out.println("Sold out");
        } else if (state == SOLD) {
            System.out.println("Wait, the ball will soon be yours");
        }
    }

    public void ejectQuarter() {
        if (state == HAS_QUARTER) {
            System.out.println("Returning coin");
            state = NO_QUARTER;
        } else if (state == NO_QUARTER) {
            System.out.println("No Quarter to return");
        } else if (state == SOLD_OUT) {
            System.out.println("You did not insert a token");
        } else if (state == SOLD) {
            System.out.println("You already bought a ball");
        }
    }

    public void turnCrank() {
        if (state == HAS_QUARTER) {
            System.out.println("Crank turned");
            state = SOLD;
            dispense();
            state = NO_QUARTER;
        } else if (state == NO_QUARTER) {
            System.out.println("No Quarter to turn Crank");
        } else if (state == SOLD_OUT) {
            System.out.println("Sorry, SoldOut");
        } else if (state == SOLD) {
            System.out.println("You already bought a ball");
        }
    }

    private void dispense() {
        if (state == SOLD) {
            System.out.println("Ball is being dispensed");
            count -= 1;
            if (count == 0) {
                System.out.println("No balls left");
                state = SOLD_OUT;
            } else {
                state = NO_QUARTER;
            }
        } else if (state == NO_QUARTER) {
            System.out.println("Insert a Coin");
        } else if (state == SOLD_OUT) {
            System.out.println("Sold Out");
        } else if (state == HAS_QUARTER) {
            System.out.println("Ball Stuck");
        }
    }
}
このような構造を持つ油抜き機があると言いましょう.
このコードは、クラスから実装から処理までのすべての構造です.

状態モードの適用


このような抽出マシンを実行する過程で,10マシンごとにより多くのコードの追加が要求される.
現在、このコードは変更された部分をカプセル化する最も基本的な原則を守っていない.そのため、新しいデザインを追加する必要があります.
  • は、全ての動作方法を含むインタフェース
  • を定義する.
  • ステータスインタフェース定義
  • 、各ステータスでの動作結果を表示
  • 状態全委任

  • 状態モードとは、オブジェクトの内部状態の変化に伴ってオブジェクトの動作を変化させ、クラス変換のような効果を得る方法である.

    変更


    まずWinnerStateを処理するクラスを作成します.そして,HasToken状態では,Winnerに10%の確率を与えるコードを記述する必要がある.

    完全なコード