Head First设计模式-状态模式
来源:互联网 发布:子不语怪力乱神 知乎 编辑:程序博客网 时间:2024/06/05 08:39
一、整体代码
State.java
public interface State { public void insertQuarter();public void ejectQuarter();public void turnCrank();public void dispense();}
SoldState.java
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";}}
SoldOutState.java
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";}}
NoQuarterState.java
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";}}
HasQuarterState.java
import java.util.Random;public class HasQuarterState implements State {Random randomWinner = new Random(System.currentTimeMillis());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...");int winner = randomWinner.nextInt(10);if ((winner == 0) && (gumballMachine.getCount() > 1)) {gumballMachine.setState(gumballMachine.getWinnerState());} else {gumballMachine.setState(gumballMachine.getSoldState());}} public void dispense() { System.out.println("No gumball dispensed"); } public String toString() {return "waiting for turn of crank";}}
WinnerState.java
public class WinnerState implements State { GumballMachine gumballMachine; public WinnerState(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("Please wait, we're already giving you a Gumball");} public void turnCrank() {System.out.println("Turning again doesn't get you another gumball!");} public void dispense() {System.out.println("YOU'RE A WINNER! You get two gumballs for your quarter");gumballMachine.releaseBall();if (gumballMachine.getCount() == 0) {gumballMachine.setState(gumballMachine.getSoldOutState());} else {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 "despensing two gumballs for your quarter, because YOU'RE A WINNER!";}}
GumballMachine.java
public class GumballMachine { State soldOutState;State noQuarterState;State hasQuarterState;State soldState;State winnerState; 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);winnerState = new WinnerState(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 State getWinnerState() { return winnerState; } 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.java
public class GumballMachineTestDrive {public static void main(String[] args) {GumballMachine gumballMachine = new GumballMachine(10);System.out.println(gumballMachine);gumballMachine.insertQuarter();gumballMachine.turnCrank();gumballMachine.insertQuarter();gumballMachine.turnCrank();System.out.println(gumballMachine);gumballMachine.insertQuarter();gumballMachine.turnCrank();gumballMachine.insertQuarter();gumballMachine.turnCrank();System.out.println(gumballMachine);gumballMachine.insertQuarter();gumballMachine.turnCrank();gumballMachine.insertQuarter();gumballMachine.turnCrank();System.out.println(gumballMachine);gumballMachine.insertQuarter();gumballMachine.turnCrank();gumballMachine.insertQuarter();gumballMachine.turnCrank();System.out.println(gumballMachine);gumballMachine.insertQuarter();gumballMachine.turnCrank();gumballMachine.insertQuarter();gumballMachine.turnCrank();System.out.println(gumballMachine);}}
二、解释
状态模式:允许对象在内部对象改变时改变它的行为,对象好像修改了他的类。
- Head First设计模式-状态模式
- 《Head First 设计模式》状态模式
- 《Head First 设计模式》之状态模式
- <Head First 设计模式>:状态模式:GumballMachine
- First-Head 设计模式:状态模式
- Head First设计模式之状态模式
- 状态模式-《Head First 设计模式》
- Head First---状态模式
- Head First 设计模式
- Head-first设计模式
- head first 设计模式
- head first 设计模式
- Head First 设计模式
- 《Head First 设计模式》
- Head First设计模式
- Head First《设计模式》
- 《Head First设计模式》
- Head First设计模式
- nefu117素数定理
- Codeforces Round #207 (Div. 1)(A,B,C)
- 接口、Object类(toString(), equals(), hashCode())
- OpenGL超级宝典笔记5
- TCP为什么要三次握手
- Head First设计模式-状态模式
- html5游戏开发的五个最佳实践
- 数字签名和数字加密
- [各种面试题] 小朋友拿糖果
- uva10911 - Forming Quiz Teams 集合DP
- POJ2562 输入两个数计算进位
- Clone Graph
- 10098 全排列水题
- json案例