State Pattern: Allow an object to alter its behaviour when it’s internal state changes.
The object will appear to change its class..
Example
State.java
1 2 3 4 5 6 7 8 9 10 | package com.statepattern.example; public interface State { public void insertCard(); public void ejectCard(); public void enterAmount(); public void dispense(); } |
NoCardState.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package com.statepattern.example; public class NoCardState implements State { CashMachine cashMachine; public NoCardState(CashMachine cashMachine) { this .cashMachine = cashMachine; } @Override public void insertCard() { System.out.println( "Please insert your card now" ); cashMachine.setState(cashMachine.getHasCardState()); } @Override public void ejectCard() { System.out.println( "Can't return anything as there is no Card" ); } @Override public void enterAmount() { System.out.println( "Can't enter amount now as there is no card" ); } @Override public void dispense() { System.out.println( "Can't dispense amount now as there is no card" ); } public String toString(){ return "No Card State" ; } } |
HasCardState.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package com.statepattern.example; public class HasCardState implements State{ CashMachine cashMachine; public HasCardState(CashMachine cashMachine) { this .cashMachine = cashMachine; } @Override public void insertCard() { System.out.println( "you can't insert another Card" ); } @Override public void ejectCard() { System.out.println( "Your card is returned now" ); cashMachine.setState(cashMachine.getNoCardState()); } @Override public void enterAmount() { cashMachine.setState(cashMachine.getWorkingState()); } @Override public void dispense() { System.out.println( "cash Machine is already dispensing" ); } public String toString(){ return "Has Card State" ; } } |
WorkingState.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | package com.statepattern.example; public class WorkingState implements State { CashMachine cashMachine; public WorkingState(CashMachine cashMachine) { this .cashMachine = cashMachine; } @Override public void insertCard() { System.out.println( "You can't insert card Now as processing is in progress" ); } @Override public void ejectCard() { System.out.println( "You can't eject card Now as processing is in progress" ); } @Override public void enterAmount() { System.out.println( "Already Processing your Transcation Please wait" ); } @Override public void dispense() { if (cashMachine.getBalance()>cashMachine.getWithdrawAmt()){ cashMachine.setBalance(cashMachine.getBalance()-cashMachine.getWithdrawAmt()); System.out.println( "Dispensing amount " + cashMachine.getWithdrawAmt()); System.out.println( "Now Balance is " + cashMachine.getBalance()); cashMachine.setState(cashMachine.getNoCardState()); } else { System.out.println( "Sorry!.. Sufficient balance is not available" ); cashMachine.setState(cashMachine.getOutofServiceState()); } } public String toString(){ return "Working State" ; } } |
OutofServiceState.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package com.statepattern.example; public class OutofServiceState implements State { CashMachine cashMachine; public OutofServiceState(CashMachine cashMachine) { this .cashMachine = cashMachine; } @Override public void insertCard() { System.out.println( "Can't insert card now as cash Machine is out of Service" ); } @Override public void ejectCard() { System.out.println( "Can't eject Card now as cash Machine is out of Service" ); } @Override public void enterAmount() { System.out.println( "Can't enter amount now as cash Machine is out of Service" ); } @Override public void dispense() { System.out.println( "Can't dispense amount now as cash Machine is out of Service" ); } public String toString(){ return "OutofService State" ; } } |
CashMachine.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | package com.statepattern.example; public class CashMachine { private State hasCardState; private State noCardState; private State workingState; private State outofServiceState; //setting the default state to Out of Service private State state = outofServiceState; private int balance; private int withdrawAmt; public CashMachine( int balance) { hasCardState = new HasCardState( this ); noCardState = new NoCardState( this ); workingState = new WorkingState( this ); outofServiceState = new OutofServiceState( this ); this .balance = balance; if (balance > 0 ) { //if the balance is greather than zero then set the cashMachine to No Card State state = noCardState; } } public void setState(State state) { this .state = state; } public void insertCard() { state.insertCard(); } public void ejectCard() { state.ejectCard(); } public void enterAmount( int amount) { this .withdrawAmt = amount; state.enterAmount(); } public void dispense() { state.dispense(); } public State getHasCardState() { return hasCardState; } public void setHasCardState(State hasCardState) { this .hasCardState = hasCardState; } public State getNoCardState() { return noCardState; } public void setNoCardState(State noCardState) { this .noCardState = noCardState; } public State getWorkingState() { return workingState; } public void setWorkingState(State workingState) { this .workingState = workingState; } public State getOutofServiceState() { return outofServiceState; } public void setOutofServiceState(State outofServiceState) { this .outofServiceState = outofServiceState; } public State getState() { return state; } public void setBalance( int balance) { this .balance = balance; } public int getBalance() { return balance; } public int getWithdrawAmt() { return withdrawAmt; } public void printState() { System.out.println( "Current State : " + this .state); } } |
CashMachineTestDrive.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package com.statepattern.example; public class CashMachineTestDrive { public static void main(String[] args) { CashMachine cashMachine = new CashMachine( 100000 ); //printing current state using method printState cashMachine.printState(); cashMachine.insertCard(); cashMachine.printState(); cashMachine.enterAmount( 50000 ); cashMachine.printState(); cashMachine.dispense(); cashMachine.printState(); } } |
Home
No comments:
Post a Comment