一头扎进设计模式-状态模式

定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

用自己的话说:把每个状态的具体行为封装的具体的某个类中,让状态类代替主体是实现一些操作。

代码:
定义一个状态接口类

public interface State {
    //插入硬币
    void insertQuarter();
    //退出硬币
    void ejectQuarter();
    //扭动按钮
    void tumCrank();
    //发放糖果
    void dispense();
    String toString();
}

定义第一个状态,已投币状态

public class HasQuarterState implements State {
    Random randomWinner = new Random(System.currentTimeMillis());
    GumballMachine gumballMachine;//内置一个当前糖果机,用于对状态进行切换
    /**
     * 
     */
    public HasQuarterState(GumballMachine gumballMachine) {
        this.gumballMachine=gumballMachine;
    }
    /* (非 Javadoc)
     * @see com.jjt.state.State#insertQuarter()
     */
    @Override
    public void insertQuarter() {
        System.out.println("不好意思,已经有人投了钱");
    }

    /* (非 Javadoc)
     * @see com.jjt.state.State#ejectQuarter()
     */
    @Override
    public void ejectQuarter() {
        System.out.println("退给您25分");
        this.gumballMachine.setState(this.gumballMachine.getNoQuarterState());
    }

    /* (非 Javadoc)
     * @see com.jjt.state.State#tumCrank()
     */
    @Override
    public void tumCrank() {
        System.out.println("扭动按钮");
        //表示有一定的几率会中大奖,会弹出两个小球
        int winner = randomWinner.nextInt(10);

        if((winner==0)&&gumballMachine.getGumCount()>1){
            gumballMachine.setState(this.gumballMachine.getWinnerState());
        }else{
            this.gumballMachine.setState(gumballMachine.getSoldState());
        }

    }

    /* (非 Javadoc)
     * @see com.jjt.state.State#dispense()
     */
    @Override
    public void dispense() {
        System.out.println("请先扭动按钮");
    }

    @Override
    public String toString() {
        return "投币状态";
    }

}

定义第二个状态,未投币状态

public class NoQuartState implements State {

    GumballMachine gumballMachine;
    /**
     * 
     */
    public NoQuartState(GumballMachine gumballMachine) {
        this.gumballMachine=gumballMachine;
    }
    /* (非 Javadoc)
     * @see com.jjt.state.State#insertQuarter()
     */
    @Override
    public void insertQuarter() {
        System.out.println("您投入了25分元");
        gumballMachine.setState(gumballMachine.getHasQuarterState());

    }

    /* (非 Javadoc)
     * @see com.jjt.state.State#ejectQuarter()
     */
    @Override
    public void ejectQuarter() {
        System.out.println("您还没给钱,不能请求退钱");
    }

    /* (非 Javadoc)
     * @see com.jjt.state.State#tumCrank()
     */
    @Override
    public void tumCrank() {
        System.out.println("您还没给钱,不能扭动机器");
    }

    /* (非 Javadoc)
     * @see com.jjt.state.State#dispense()
     */
    @Override
    public void dispense() {
        System.out.println("您没给钱不能发放糖果");

    }
    @Override
    public String toString() {

        return "没有投币状态";
    }
}

定义第三个状态,售罄状态

public class SoldOutState implements State {

    GumballMachine gumballMachine;

    /**
     * 
     */
    public SoldOutState(GumballMachine gumballMachine) {
        this.gumballMachine = gumballMachine;
    }

    /* (非 Javadoc)
     * @see com.jjt.state.State#insertQuarter()
     */
    @Override
    public void insertQuarter() {
        System.out.println("无法投币,销磬");
    }

    /* (非 Javadoc)
     * @see com.jjt.state.State#ejectQuarter()
     */
    @Override
    public void ejectQuarter() {
        System.out.println("无法退钱,销磬");

    }

    /* (非 Javadoc)
     * @see com.jjt.state.State#tumCrank()
     */
    @Override
    public void tumCrank() {
        System.out.println("无法转动,销磬");

    }

    /* (非 Javadoc)
     * @see com.jjt.state.State#dispense()
     */
    @Override
    public void dispense() {
        System.out.println("无法发放糖果,销磬");
    }
    @Override
    public String toString() {

        return "售罄状态";
    }
}

定义第四个状态,销售状态

public class SoldState implements State {

    GumballMachine gumballMachine;
    /**
     * 
     */
    public SoldState(GumballMachine gumballMachine) {
        this.gumballMachine = gumballMachine;
    }
    /* (非 Javadoc)
     * @see com.jjt.state.State#insertQuarter()
     */
    @Override
    public void insertQuarter() {
        System.out.println("别人已经插入币");
    }

    /* (非 Javadoc)
     * @see com.jjt.state.State#ejectQuarter()
     */
    @Override
    public void ejectQuarter() {
        System.out.println("已经转动,无法退款");
    }

    /* (非 Javadoc)
     * @see com.jjt.state.State#tumCrank()
     */
    @Override
    public void tumCrank() {
        System.out.println("已经转动");
    }

    /* (非 Javadoc)
     * @see com.jjt.state.State#dispense()
     */
    @Override
    public void dispense() {
        gumballMachine.releaseBall();
        if(this.gumballMachine.getGumCount()>0){
            this.gumballMachine.setState(gumballMachine.getNoQuarterState());
        }else{                                      
            System.out.println("糖果销售完了哟");
            this.gumballMachine.setState(gumballMachine.getSoldOutState());
        }
    }
    @Override
    public String toString() {

        return "销售中状态";
    }


}

定义第五个状态,幸运者状态,该状态时会弹出两个小球

public class WinnerState implements State {
    GumballMachine gumballMachine;
    /**
     * 
     */
    public WinnerState(GumballMachine gumballMachine) {
        this.gumballMachine=gumballMachine;
    }
    /* (非 Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {

        return "幸运者状态";
    }
    /* (非 Javadoc)
     * @see com.jjt.state.State#insertQuarter()
     */
    @Override
    public void insertQuarter() {
        System.out.println("幸运者状态,无法插入");
    }

    /* (非 Javadoc)
     * @see com.jjt.state.State#ejectQuarter()
     */
    @Override
    public void ejectQuarter() {
        System.out.println("幸运者状态,无法退币");

    }

    /* (非 Javadoc)
     * @see com.jjt.state.State#tumCrank()
     */
    @Override
    public void tumCrank() {
        System.out.println("幸运者状态,无法退钱");
    }

    /* (非 Javadoc)
     * @see com.jjt.state.State#dispense()
     */
    @Override
    public void dispense() {
        System.out.println("恭喜你,进入幸运者状态,要弹出两个糖果");
        gumballMachine.releaseBall();
        if(gumballMachine.getGumCount()==0){
            gumballMachine.setState(gumballMachine.getSoldOutState());
        }else{
            gumballMachine.releaseBall();
            if(gumballMachine.getGumCount()>0)
                gumballMachine.setState(gumballMachine.getNoQuarterState());
            else 
                gumballMachine.setState(gumballMachine.getSoldOutState());
        }
    }

}

定义一个糖果机

public class GumballMachine {
    State winnerState;
    State  soldOutState;
    State noQuarterState;
    State hasQuarterState;
    State soldState;
    State state = soldOutState;
    int gumCount = 0;

    /**
     * 
     */
    public GumballMachine(int numberGumballs) {
        soldOutState = new SoldOutState(this);
        noQuarterState= new NoQuartState(this);
        hasQuarterState = new HasQuarterState(this);
        winnerState = new WinnerState(this);
        soldState = new SoldState(this);
        this.gumCount = numberGumballs;
        if(numberGumballs>0)
            state = noQuarterState;
    }

    public State getWinnerState() {
        return winnerState;
    }

    public void setWinnerState(State winnerState) {
        this.winnerState = winnerState;
    }
    //使用时,调用状态里面的方法进行调用
    public void insertQuarter(){
        state.insertQuarter();
    }

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

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

    void releaseBall(){
        if(gumCount!=0){
            gumCount  = gumCount -1;
            System.out.println("弹出一个糖果");
        }
    }


    public State getSoldOutState() {
        return soldOutState;
    }

    public void setSoldOutState(State soldOutState) {
        this.soldOutState = soldOutState;
    }

    public State getNoQuarterState() {
        return noQuarterState;
    }

    public void setNoQuarterState(State noQuarterState) {
        this.noQuarterState = noQuarterState;
    }

    public State getHasQuarterState() {
        return hasQuarterState;
    }

    public void setHasQuarterState(State hasQuarterState) {
        this.hasQuarterState = hasQuarterState;
    }

    public State getSoldState() {
        return soldState;
    }

    public void setSoldState(State soldState) {
        this.soldState = soldState;
    }

    public int getGumCount() {
        return gumCount;
    }

    public void setGumCount(int gumCount) {

        this.gumCount = gumCount;
    }

    public State getState() {
        return state;
    }

    void setState(State state) {
        System.out.println("--");
        System.out.println("更换状态"+state.toString());
        System.out.println("--");

        this.state = state;
    }

测试:

public static void main(String[] args){
        GumballMachine gumballMachine =new GumballMachine(25);
        gumballMachine.insertQuarter();
        gumballMachine.ejectQuarter();
        gumballMachine.insertQuarter();
        gumballMachine.turnCrank();

        for(int i = 0 ;i<25;i++){
            gumballMachine.insertQuarter();
            gumballMachine.turnCrank();
        }
    }
您投入了25分元
--
更换状态投币状态
--
退给您25分
--
更换状态没有投币状态
--
您投入了25分元
--
更换状态投币状态
--
扭动按钮
--
更换状态销售中状态
--
弹出一个糖果
--
更换状态没有投币状态
....
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值