- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace State
- {
- class CRunMain
- {
- static void Main(string[] args)
- {
- }
- };
- public class CGumballMachine
- {
- //contructor
- public CGumballMachine(int nGumballs)
- {
- this.m_nCount = nGumballs;
- m_stateNoQuareter = new CNoQuarterState(this);
- m_stateHasQuareter = new CHasQuarterState(this);
- m_stateSoldState = new CSoldState(this);
- m_stateSoldOut = new CSoldOutState(this);
- m_stateCurrent = null;
- if (this.m_nCount > 0)
- {
- this.m_stateCurrent = this.m_stateNoQuareter;
- }
- else
- {
- this.m_stateCurrent = this.m_stateSoldOut;
- }
- }
- //property
- public IState StateOfMechine
- {
- get
- {
- return this.m_stateCurrent;
- }
- set
- {
- this.m_stateCurrent = value;
- }
- }
- public int nCount
- {
- get
- {
- return this.m_nCount;
- }
- set
- {
- this.m_nCount = value;
- }
- }
- //member function
- public string InsertQuarter()
- {
- return this.m_stateCurrent.InsertQuarter();
- }
- public string EjectQuarter()
- {
- return this.m_stateCurrent.EjectQuarter();
- }
- public string TurnCrank()
- {
- return this.m_stateCurrent.TurnCrank() + this.m_stateCurrent.Dispense();
- }
- public string ReleaseBall()
- {
- if (0 != this.m_nCount)
- {
- this.m_nCount--;
- }
- return "A gumball comes rolling out the slot.../n";
- }
- public string ReFill(int nGumballs)
- {
- if (nGumballs <= 0)
- {
- return "erro param!";
- }
- this.m_nCount += nGumballs;
- this.m_stateCurrent = this.m_stateNoQuareter;
- return "/nReFill: " + nGumballs + "gumballs were added. " + "The gumball count is: " + this.m_nCount;
- }
- public string MachineStateHeader()
- {
- StringBuilder sbResult = new StringBuilder();
- sbResult.Append("Mighty Gumball, Inc.");
- sbResult.Append("/nC# Enabled Standing Gumball Model #2005/n");
- sbResult.Append("Inventory: " + this.m_nCount + " Gumball");
- if (1 != this.m_nCount)
- {
- sbResult.Append("s");
- }
- sbResult.Append("/nMachines is " + this.m_stateCurrent.ToString());
- return sbResult.ToString();
- }
- //data member
- private IState m_stateSoldOut;
- private IState m_stateNoQuareter;
- private IState m_stateHasQuareter;
- private IState m_stateSoldState;
- private IState m_stateCurrent;
- private int m_nCount;
- };
- public interface IState
- {
- string InsertQuarter();
- string EjectQuarter();
- string TurnCrank();
- string Dispense();
- };
- public class CSoldState : IState
- {
- //construct
- public CSoldState(CGumballMachine objGmMachine)
- {
- this.m_objGbMachine = objGmMachine;
- this.m_stateNoQuarter = new CNoQuarterState(this.m_objGbMachine);
- this.m_stateSoldOut = new CSoldOutState(this.m_objGbMachine);
- }
- //inhert from IState
- public string InsertQuarter()
- {
- return "Please wait, we're already giving you a gumball/n";
- }
- public string EjectQuarter()
- {
- return "Sorry, you already turned the crank/n";
- }
- public string TurnCrank()
- {
- return "Turning twice doesn't get you another gumball!/n";
- }
- public string Dispense()
- {
- string strOutput;
- strOutput = this.m_objGbMachine.ReleaseBall();
- if (this.m_objGbMachine.nCount > 0)
- {
- this.m_objGbMachine.StateOfMechine = this.m_stateNoQuarter;
- }
- else
- {
- this.m_objGbMachine.StateOfMechine = this.m_stateSoldOut;
- }
- return strOutput;
- }
- public override string ToString()
- {
- return "delivering a gumball";
- }
- private CGumballMachine m_objGbMachine;
- private IState m_stateNoQuarter;
- private IState m_stateSoldOut;
- };
- public class CSoldOutState : IState
- {
- //construct
- public CSoldOutState(CGumballMachine objGmMachine)
- {
- this.m_objGbMachine = objGmMachine;
- }
- //inhert from IState
- public string InsertQuarter()
- {
- return "You can't insert a quarter, the machine is sold out/n";
- }
- public string EjectQuarter()
- {
- return "You can't eject, you haven't inserted a quarter yet/n";
- }
- public string TurnCrank()
- {
- return "Sorry, you already turned the crank/n";
- }
- public string Dispense()
- {
- string strOutput;
- strOutput = this.m_objGbMachine.ReleaseBall();
- strOutput += "You turned, but there are no gumballs/n";
- return strOutput;
- }
- public override string ToString()
- {
- return "sold out";
- }
- private CGumballMachine m_objGbMachine;
- };
- public class CNoQuarterState : IState
- {
- //construct
- public CNoQuarterState(CGumballMachine objGmMachine)
- {
- this.m_objGbMachine = objGmMachine;
- this.m_stateHasQuarter = new CHasQuarterState(this.m_objGbMachine);
- }
- //inhert from IState
- public string InsertQuarter()
- {
- this.m_objGbMachine.StateOfMechine = this.m_stateHasQuarter;
- return "You inserted a quarter/n";
- }
- public string EjectQuarter()
- {
- return "You haven't inserted a quarter/n";
- }
- public string TurnCrank()
- {
- return "You turned but there's no quarter/n";
- }
- public string Dispense()
- {
- string strOutput;
- strOutput = this.m_objGbMachine.ReleaseBall();
- strOutput += "You need to pay first/n";
- return strOutput;
- }
- public override string ToString()
- {
- return "waiting for quarter";
- }
- private CGumballMachine m_objGbMachine;
- private IState m_stateHasQuarter;
- };
- public class CHasQuarterState : IState
- {
- //construct
- public CHasQuarterState(CGumballMachine objGmMachine)
- {
- this.m_objGbMachine = objGmMachine;
- this.m_stateNoQuarter = new CNoQuarterState(this.m_objGbMachine);
- }
- //inhert from IState
- public string InsertQuarter()
- {
- return "You can't insert another quarter/n";
- }
- public string EjectQuarter()
- {
- this.m_objGbMachine.StateOfMechine = this.m_stateNoQuarter;
- return "Quarter returned/n";
- }
- public string TurnCrank()
- {
- string strOutput;
- int nWin = 0;
- Random objRand = new Random();
- strOutput = "You turned.../n";
- nWin = objRand.Next(10);
- if ((0 == nWin) && (this.m_objGbMachine.nCount > 1))
- {
- this.m_objGbMachine.StateOfMechine = new CWinnerState(this.m_objGbMachine);
- }
- else
- {
- this.m_objGbMachine.StateOfMechine = new CSoldState(this.m_objGbMachine);
- }
- return strOutput;
- }
- public string Dispense()
- {
- return "No gumball dispensed/n";
- }
- public override string ToString()
- {
- return "waiting for turn of crank";
- }
- private CGumballMachine m_objGbMachine;
- private IState m_stateNoQuarter;
- };
- public class CWinnerState : IState
- {
- //construct
- public CWinnerState(CGumballMachine objGmMachine)
- {
- this.m_objGbMachine = objGmMachine;
- this.m_stateNoQuarter = new CNoQuarterState(this.m_objGbMachine);
- this.m_stateSoldOut = new CSoldOutState(this.m_objGbMachine);
- }
- //inhert from IState
- public string InsertQuarter()
- {
- return "Please wait, we're already giving you a gumball/n";
- }
- public string EjectQuarter()
- {
- return "Sorry, you already turned the crank/n";
- }
- public string TurnCrank()
- {
- return "Turning twice doesn't get you another gumball!/n";
- }
- public string Dispense()
- {
- string strOutput;
- strOutput = "YOUR A WINNER! You get two gumballs for your quarter/n";
- strOutput += this.m_objGbMachine.ReleaseBall();
- if (0 == this.m_objGbMachine.nCount)
- {
- this.m_objGbMachine.StateOfMechine = this.m_stateSoldOut;
- }
- else
- {
- strOutput += this.m_objGbMachine.ReleaseBall();
- if (this.m_objGbMachine.nCount > 0)
- {
- this.m_objGbMachine.StateOfMechine = this.m_stateNoQuarter;
- }
- else
- {
- strOutput += "Oops, out of gumballs!/n";
- this.m_objGbMachine.StateOfMechine = this.m_stateSoldOut;
- }
- }
- return strOutput;
- }
- public override string ToString()
- {
- return "";
- }
- private CGumballMachine m_objGbMachine;
- private IState m_stateNoQuarter;
- private IState m_stateSoldOut;
- };
- }