Headfirst java设计模式-状态模式

状态模式:封装基于状态的行为,并将行为委托到当前状态。

代码实现:
(1)定义一个糖果机状态接口

public interface State {
    /**
     * insert quarter
     */
    void insertQuarter();

    /**
     * eject quarter
     */
    void ejectQuarter();

    /**
     * turn crank
     */
    void turnCrank();

    /**
     * dispense
     */
    void dispense();
}

(3)继承糖果机状态接口实现相应的具体状态

public class HasQuarterState implements State{
    GumballMachine gumballMachine;

    public HasQuarterState(GumballMachine gumballMachine) {
        // TODO Auto-generated constructor stub
        this.gumballMachine = gumballMachine;
    }

    @Override
    public void insertQuarter() {
        // TODO Auto-generated method stub
        System.out.println("You can't insert another quarter.");
    }

    @Override
    public void ejectQuarter() {
        // TODO Auto-generated method stub
        System.out.println("Quarter returned.");
        gumballMachine.setstate(gumballMachine.noquarterstate);
    }

    @Override
    public void turnCrank() {
        // TODO Auto-generated method stub
        System.out.println("You turned.");
        gumballMachine.setstate(gumballMachine.soldstate);
    }

    @Override
    public void dispense() {
        // TODO Auto-generated method stub
        System.out.println("No gumball dispensed.");
    }

}

public class NoQuarterState implements State{
    GumballMachine gumballmachine;

    public NoQuarterState(GumballMachine gumballmachine){
        this.gumballmachine = gumballmachine;
    }

    @Override
    public void insertQuarter() {
        // TODO Auto-generated method stub
        System.out.println("You inserted a quarter.");
        gumballmachine.setstate(gumballmachine.hasquarterstate);
    }

    @Override
    public void ejectQuarter() {
        // TODO Auto-generated method stub
        System.out.println("You hasn't inserted a quarter.");
    }

    @Override
    public void turnCrank() {
        // TODO Auto-generated method stub
        System.out.println("You turned, but there is no quarter.");
    }

    @Override
    public void dispense() {
        // TODO Auto-generated method stub
        System.out.println("You need to pay first.");
    }

}

public class SoldOutState implements State{
    GumballMachine gumballMachine;

    public SoldOutState(GumballMachine gumballMachine) {
        // TODO Auto-generated constructor stub
        this.gumballMachine = gumballMachine;
    }

    @Override
    public void insertQuarter() {
        // TODO Auto-generated method stub
        System.out.println("Sorry, gumball has sold out.");
    }

    @Override
    public void ejectQuarter() {
        // TODO Auto-generated method stub
        System.out.println("eject quarter.");
    }

    @Override
    public void turnCrank() {
        // TODO Auto-generated method stub
        System.out.println("Sorry , you need to pay first.");
    }

    @Override
    public void dispense() {
        // TODO Auto-generated method stub
        System.out.println("Sorry, gumball has sold out.");
    }

}

public class SoldState implements State{
    GumballMachine gumballMachine;

    public SoldState(GumballMachine gumballMachine) {
        // TODO Auto-generated constructor stub
        this.gumballMachine = gumballMachine;
    }

    @Override
    public void insertQuarter() {
        // TODO Auto-generated method stub
        System.out.println("Wait, we already give you a gumball.");
    }

    @Override
    public void ejectQuarter() {
        // TODO Auto-generated method stub
        System.out.println("Sorry, you already turned the crank.");
    }

    @Override
    public void turnCrank() {
        // TODO Auto-generated method stub
        System.out.println("Tunring twice doesn't give you another gunball.");
    }

    @Override
    public void dispense() {
        // TODO Auto-generated method stub
        gumballMachine.releaseBall();
        if (gumballMachine.count > 0) {
            gumballMachine.setstate(gumballMachine.noquarterstate);
        } else {
            System.out.println("Oops. out of gumball.");
            gumballMachine.setstate(gumballMachine.soldoutstate);
        }
    }
}

(3)实现一个糖果机的状态机类,并初始化状态机的状态

public class GumballMachine {
    State soldstate;
    State soldoutstate;
    State noquarterstate;
    State hasquarterstate;

    State state = soldoutstate;
    int count = 0;

    public GumballMachine(int numberGumball){
        soldstate = new SoldState(this);
        soldoutstate = new SoldOutState(this);
        noquarterstate = new NoQuarterState(this);
        hasquarterstate = new HasQuarterState(this);
        this.count = numberGumball;
        if (numberGumball > 0) {
            state = noquarterstate;
        }
    }

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

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

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

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

    public void releaseBall(){
        System.out.println("A gumball comes rolling out the slot...");
        if (count > 0) {
            count = count - 1;
        }
    }

    public String toString() {
        return "count = " + this.count;

    }

}

(4)测试代码

public class StateMachinePattern {
    public static void main(String[] args){
        GumballMachine gumballMachine = new GumballMachine(5);

        System.out.println(gumballMachine);

        gumballMachine.insertQuarter();
        gumballMachine.turnCrank();

        System.out.println(gumballMachine);

        gumballMachine.insertQuarter();
        gumballMachine.turnCrank();
        gumballMachine.insertQuarter();
        gumballMachine.turnCrank();

        System.out.println(gumballMachine);

        gumballMachine.insertQuarter();
        gumballMachine.insertQuarter();
        gumballMachine.turnCrank();
        gumballMachine.insertQuarter();
        gumballMachine.turnCrank();
        gumballMachine.insertQuarter();
        gumballMachine.turnCrank();

        System.out.println(gumballMachine);
    }
}

猜你喜欢

转载自blog.csdn.net/MoonShinesOnMyWay/article/details/81450737