状态设计模式

package org.springframework.security.crypto.bcrypt;

/**
 * 状态模式测试
 */
public interface State {
    /**
     * 添加硬币
     */
     void insertCoin();

    /**
     * 退出硬币
     */
    void returnCoin();

    /**
     * 转动曲柄
     */
    void turnCrank();

    /**
     * 发放操作
     */
    void dispense();

    /**
     * 打印状态
     */
    void printstate();
}

  

package org.springframework.security.crypto.bcrypt;

/**
 * 糖果机
 */
public class CandyMachine {
    State mSoldOutState;
    State mOnReadyState;
    State mHasCoin;
    State mSoldState;
    State mWinnerState;
    private State state;
    private int count = 0;

    public CandyMachine(int count) {
        this.count = count;
        mSoldOutState = new SoldOutState(this);
        mOnReadyState = new OnReadyState(this);
        mHasCoin = new HasCoin(this);
        mSoldState = new SoldState(this);
        mWinnerState = new WinnerState(this);
        if (count > 0) {
            state = mOnReadyState;
        } else {
            state = mSoldOutState;
        }
    }

    public void setState(State state) {
        this.state = state;
    }

    public void insertCoin() {
        state.insertCoin();
    }

    public void returnCoin() {
        state.returnCoin();
    }

    public void turnCrank() {
        state.turnCrank();
        state.dispense();
    }

    void releaseCandy() {

        // TODO Auto-generated method stub
        if (count > 0) {
            count = count - 1;
            System.out.println("一块糖果推出!");
        }

    }

    public int getCount() {
        return count;
    }

    public void printstate() {
        state.printstate();
    }
}

  

package org.springframework.security.crypto.bcrypt;

import java.util.Random;

/**
 * 有硬币
 */
public class HasCoin implements State {
    private CandyMachine mCandyMachine;

    public HasCoin(CandyMachine mCandyMachine) {
        this.mCandyMachine = mCandyMachine;
    }

    @Override
    public void insertCoin() {
        // TODO Auto-generated method stub
        System.out.println("你不能插入另一枚硬币!");

    }

    @Override
    public void returnCoin() {
        // TODO Auto-generated method stub
        System.out.println("硬币回归!");
        mCandyMachine.setState(mCandyMachine.mOnReadyState);
    }

    @Override
    public void turnCrank() {
        // TODO Auto-generated method stub
        System.out.println("转弯......!");
        Random ranwinner=new Random();
        int winner=ranwinner.nextInt(10);
        if(winner==0) {
            mCandyMachine.setState(mCandyMachine.mWinnerState);

        }else {
            mCandyMachine.setState(mCandyMachine.mSoldState);
        }

    }

    @Override
    public void dispense() {
    }

    @Override
    public void printstate() {
        // TODO Auto-generated method stub
        System.out.println("***HasCoin***");

    }
}

  

package org.springframework.security.crypto.bcrypt;

/**
 * 在准备状态
 */
public class OnReadyState implements State {
    private CandyMachine mCandyMachine;
    public OnReadyState(CandyMachine mCandyMachine){
        this.mCandyMachine=mCandyMachine;
    }

    @Override
    public void insertCoin() {
        System.out.println("你已经插入了一枚硬币,接下来,请转动曲柄!");
        mCandyMachine.setState(mCandyMachine.mHasCoin);
    }

    @Override
    public void returnCoin() {
        // TODO Auto-generated method stub
        System.out.println("你还没有插入硬币!");

    }

    @Override
    public void turnCrank() {
        // TODO Auto-generated method stub
        System.out.println("你转身,但你还没有插入硬币!");

    }

    @Override
    public void dispense() {
        // TODO Auto-generated method stub

    }

    @Override
    public void printstate() {
        // TODO Auto-generated method stub
        System.out.println("***OnReadyState***");

    }
}

  

package org.springframework.security.crypto.bcrypt;

/**
 * 出售完状态
 */
public class SoldOutState implements State {
    private CandyMachine mCandyMachine;
    public SoldOutState(CandyMachine mCandyMachine)
    {
        this.mCandyMachine=mCandyMachine;
    }

    @Override
    public void insertCoin() {
        // TODO Auto-generated method stub
        System.out.println("你不能插入硬币,机器卖光了!");

    }

    @Override
    public void returnCoin() {
        // TODO Auto-generated method stub
        System.out.println("你不能回来,你还没有插入硬币!");

    }

    @Override
    public void turnCrank() {
        // TODO Auto-generated method stub
        System.out.println("你转过身来,但没有糖果!");

    }

    @Override
    public void dispense() {
        // TODO Auto-generated method stub

    }

    @Override
    public void printstate() {
        // TODO Auto-generated method stub
        System.out.println("***SoldState***");

    }
}

  

package org.springframework.security.crypto.bcrypt;

/**
 * 售出操作
 */
public class SoldState implements State {
    private CandyMachine mCandyMachine;
    public SoldState(CandyMachine mCandyMachine)
    {
        this.mCandyMachine=mCandyMachine;
    }

    @Override
    public void insertCoin() {
        // TODO Auto-generated method stub
        System.out.println("请稍等!我们给你一个糖果!");

    }

    @Override
    public void returnCoin() {
        // TODO Auto-generated method stub
        System.out.println("你还没有插入硬币!");

    }

    @Override
    public void turnCrank() {
        // TODO Auto-generated method stub
        System.out.println("我们给你一个糖果,让另一个什么都没有,!");

    }

    @Override
    public void dispense() {
        // TODO Auto-generated method stub

        mCandyMachine.releaseCandy();
        if (mCandyMachine.getCount() > 0) {
            mCandyMachine.setState(mCandyMachine.mOnReadyState);
        } else {
            System.out.println("Oo,out of candies");
            mCandyMachine.setState(mCandyMachine.mSoldOutState);
        }



    }

    @Override
    public void printstate() {
        // TODO Auto-generated method stub
        System.out.println("***SoldState***");

    }
}

  

package org.springframework.security.crypto.bcrypt;

/**
 * 胜利者状态
 */
public class WinnerState implements State {
    private CandyMachine mCandyMachine;

    public WinnerState(CandyMachine mCandyMachine) {
        this.mCandyMachine = mCandyMachine;
    }

    @Override
    public void insertCoin() {
        // TODO Auto-generated method stub
        System.out.println("请稍等!我们给你一个糖果!");

    }

    @Override
    public void returnCoin() {
        // TODO Auto-generated method stub
        System.out.println("你还没有插入硬币!");

    }

    @Override
    public void turnCrank() {
        // TODO Auto-generated method stub
        System.out
                .println("我们给你一个糖果,让另一个什么都没有,!");

    }

    @Override
    public void dispense() {
        // TODO Auto-generated method stub


        mCandyMachine.releaseCandy();
        if (mCandyMachine.getCount() == 0) {
            mCandyMachine.setState(mCandyMachine.mSoldOutState);
        } else {
            System.out.println("你是赢家!你得到另一个糖果!");
            mCandyMachine.releaseCandy();
            if (mCandyMachine.getCount() > 0) {
                mCandyMachine.setState(mCandyMachine.mOnReadyState);
            } else {
                System.out.println("哦,糖果");
                mCandyMachine.setState(mCandyMachine.mSoldOutState);
            }
        }

    }

    @Override
    public void printstate() {
        // TODO Auto-generated method stub
        System.out.println("***WinnerState***");

    }
}

  

  @Test
    public void test01(){
        CandyMachine mCandyMachine = new CandyMachine(6);

        mCandyMachine.printstate();

        mCandyMachine.insertCoin();
        mCandyMachine.printstate();

        mCandyMachine.turnCrank();

        mCandyMachine.printstate();

        mCandyMachine.insertCoin();
        mCandyMachine.printstate();

        mCandyMachine.turnCrank();

        mCandyMachine.printstate();

    }

  

原文地址:https://www.cnblogs.com/x-ll123/p/11003234.html