设计模式读书笔记-2状态模式State
1.定义
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
2.类图
3.实例
State
package headfirst.state.gumballstate;public interface State { public void insertQuarter();public void ejectQuarter();public void turnCrank();public void dispense();}
package headfirst.state.gumballstate;public class HasQuarterState implements State {GumballMachine gumballMachine; public HasQuarterState(GumballMachine gumballMachine) {this.gumballMachine = gumballMachine;} public void insertQuarter() {System.out.println("You can't insert another quarter");} public void ejectQuarter() {System.out.println("Quarter returned");gumballMachine.setState(gumballMachine.getNoQuarterState());} public void turnCrank() {System.out.println("You turned...");gumballMachine.setState(gumballMachine.getSoldState());} public void dispense() { System.out.println("No gumball dispensed"); } public String toString() {return "waiting for turn of crank";}}
package headfirst.state.gumballstate;public class NoQuarterState implements State { GumballMachine gumballMachine; public NoQuarterState(GumballMachine gumballMachine) { this.gumballMachine = gumballMachine; } public void insertQuarter() {System.out.println("You inserted a quarter");gumballMachine.setState(gumballMachine.getHasQuarterState());} public void ejectQuarter() {System.out.println("You haven't inserted a quarter");} public void turnCrank() {System.out.println("You turned, but there's no quarter"); } public void dispense() {System.out.println("You need to pay first");} public String toString() {return "waiting for quarter";}}
package headfirst.state.gumballstate;public class SoldOutState implements State { GumballMachine gumballMachine; public SoldOutState(GumballMachine gumballMachine) { this.gumballMachine = gumballMachine; } public void insertQuarter() {System.out.println("You can't insert a quarter, the machine is sold out");} public void ejectQuarter() {System.out.println("You can't eject, you haven't inserted a quarter yet");} public void turnCrank() {System.out.println("You turned, but there are no gumballs");} public void dispense() {System.out.println("No gumball dispensed");} public String toString() {return "sold out";}}
package headfirst.state.gumballstate;public class SoldState implements State { GumballMachine gumballMachine; public SoldState(GumballMachine gumballMachine) { this.gumballMachine = gumballMachine; } public void insertQuarter() {System.out.println("Please wait, we're already giving you a gumball");} public void ejectQuarter() {System.out.println("Sorry, you already turned the crank");} public void turnCrank() {System.out.println("Turning twice doesn't get you another gumball!");} public void dispense() {gumballMachine.releaseBall();if (gumballMachine.getCount() > 0) {gumballMachine.setState(gumballMachine.getNoQuarterState());} else {System.out.println("Oops, out of gumballs!");gumballMachine.setState(gumballMachine.getSoldOutState());}} public String toString() {return "dispensing a gumball";}}
package headfirst.state.gumballstate;public class GumballMachine { State soldOutState;State noQuarterState;State hasQuarterState;State soldState; State state = soldOutState;int count = 0; public GumballMachine(int numberGumballs) {soldOutState = new SoldOutState(this);noQuarterState = new NoQuarterState(this);hasQuarterState = new HasQuarterState(this);soldState = new SoldState(this);this.count = numberGumballs; if (numberGumballs > 0) {state = noQuarterState;} } public void insertQuarter() {state.insertQuarter();} public void ejectQuarter() {state.ejectQuarter();} public void turnCrank() {state.turnCrank();state.dispense();}void setState(State state) {this.state = state;} void releaseBall() {System.out.println("A gumball comes rolling out the slot...");if (count != 0) {count = count - 1;}} int getCount() {return count;} void refill(int count) {this.count = count;state = noQuarterState;} public State getState() { return state; } public State getSoldOutState() { return soldOutState; } public State getNoQuarterState() { return noQuarterState; } public State getHasQuarterState() { return hasQuarterState; } public State getSoldState() { return soldState; } public String toString() {StringBuffer result = new StringBuffer();result.append("\nMighty Gumball, Inc.");result.append("\nJava-enabled Standing Gumball Model #2004");result.append("\nInventory: " + count + " gumball");if (count != 1) {result.append("s");}result.append("\n");result.append("Machine is " + state + "\n");return result.toString();}}
package headfirst.state.gumballstate;public class GumballMachineTestDrive {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);}}