首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计方式读书笔记-2状态模式State

2012-06-29 
设计模式读书笔记-2状态模式State1.定义当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改

设计模式读书笔记-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();}


HasQuarterState
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";}}


NoQuarterState
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";}}


SoldOutState
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";}}



SoldState
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";}}


GumballMachine
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();}}


GumballMachineTestDrive
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);}}

热点排行