现在的位置: 首页 > 综合 > 正文

没写完的状态模式

2013年10月02日 ⁄ 综合 ⁄ 共 9868字 ⁄ 字号 评论关闭
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace State
  6. {
  7.     class CRunMain
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.         }
  12.     };
  13.     public class CGumballMachine
  14.     {
  15.         //contructor
  16.         public CGumballMachine(int nGumballs)
  17.         {
  18.             this.m_nCount = nGumballs;
  19.             m_stateNoQuareter = new CNoQuarterState(this);
  20.             m_stateHasQuareter = new CHasQuarterState(this);
  21.             m_stateSoldState = new CSoldState(this);
  22.             m_stateSoldOut = new CSoldOutState(this);
  23.             m_stateCurrent = null;
  24.             if (this.m_nCount > 0)
  25.             {
  26.                 this.m_stateCurrent = this.m_stateNoQuareter;
  27.             }
  28.             else
  29.             {
  30.                 this.m_stateCurrent = this.m_stateSoldOut;
  31.             }
  32.         }
  33.         //property
  34.         public IState StateOfMechine
  35.         {
  36.             get
  37.             {
  38.                 return this.m_stateCurrent;
  39.             }
  40.             set
  41.             {
  42.                 this.m_stateCurrent = value;
  43.             }
  44.         }
  45.         public int nCount
  46.         {
  47.             get
  48.             {
  49.                 return this.m_nCount;
  50.             }
  51.             set
  52.             {
  53.                 this.m_nCount = value;
  54.             }
  55.         }
  56.         //member function
  57.         public string InsertQuarter()
  58.         {
  59.             return this.m_stateCurrent.InsertQuarter();
  60.         }
  61.         public string EjectQuarter()
  62.         {
  63.             return this.m_stateCurrent.EjectQuarter();
  64.         }
  65.         public string TurnCrank()
  66.         {
  67.             return this.m_stateCurrent.TurnCrank() + this.m_stateCurrent.Dispense();
  68.         }
  69.         public string ReleaseBall()
  70.         {
  71.             if (0 != this.m_nCount)
  72.             {
  73.                 this.m_nCount--;
  74.             }
  75.             
  76.             return "A gumball comes rolling out the slot.../n";
  77.         }
  78.         public string ReFill(int nGumballs)
  79.         {
  80.             if (nGumballs <= 0)
  81.             {
  82.                 return "erro param!";
  83.             }
  84.             this.m_nCount += nGumballs;
  85.             this.m_stateCurrent = this.m_stateNoQuareter;
  86.             return "/nReFill: " + nGumballs + "gumballs were added. " + "The gumball count is: " + this.m_nCount;
  87.         }
  88.         public string MachineStateHeader()
  89.         {
  90.             StringBuilder sbResult = new StringBuilder();
  91.             sbResult.Append("Mighty Gumball, Inc.");
  92.             sbResult.Append("/nC# Enabled Standing Gumball Model #2005/n");
  93.             sbResult.Append("Inventory: " + this.m_nCount + " Gumball");
  94.             if (1 != this.m_nCount)
  95.             {
  96.                 sbResult.Append("s");
  97.             }
  98.             sbResult.Append("/nMachines is " + this.m_stateCurrent.ToString());
  99.             return sbResult.ToString();
  100.         }
  101.         //data member
  102.         private IState m_stateSoldOut;
  103.         private IState m_stateNoQuareter;
  104.         private IState m_stateHasQuareter;
  105.         private IState m_stateSoldState;
  106.         private IState m_stateCurrent;
  107.         private int m_nCount;
  108.     };          
  109.       
  110.     public interface IState
  111.     {
  112.         string InsertQuarter();
  113.         string EjectQuarter();
  114.         string TurnCrank();
  115.         string Dispense();
  116.     };   
  117.     public class CSoldState : IState
  118.     {
  119.         //construct
  120.         public CSoldState(CGumballMachine objGmMachine)
  121.         {
  122.             this.m_objGbMachine = objGmMachine;
  123.             this.m_stateNoQuarter = new CNoQuarterState(this.m_objGbMachine);
  124.             this.m_stateSoldOut = new CSoldOutState(this.m_objGbMachine);
  125.         }
  126.         //inhert from IState
  127.         public string InsertQuarter()
  128.         {
  129.             return "Please wait, we're already giving you a gumball/n";
  130.         }
  131.         public string EjectQuarter()
  132.         {
  133.              return "Sorry, you already turned the crank/n";
  134.         }
  135.         public string TurnCrank()
  136.         {
  137.              return "Turning twice doesn't get you another gumball!/n";
  138.         }
  139.         public string Dispense()
  140.         {
  141.             string strOutput;
  142.             strOutput = this.m_objGbMachine.ReleaseBall();
  143.             if (this.m_objGbMachine.nCount > 0)
  144.             {
  145.                 this.m_objGbMachine.StateOfMechine = this.m_stateNoQuarter;
  146.             }
  147.             else
  148.             {
  149.                 this.m_objGbMachine.StateOfMechine = this.m_stateSoldOut;
  150.             }
  151.             return strOutput;
  152.         }
  153.         public override string  ToString()
  154.         {
  155.              return "delivering a gumball";
  156.         }
  157.         private CGumballMachine m_objGbMachine;
  158.         private IState m_stateNoQuarter;
  159.         private IState m_stateSoldOut;
  160.     };
  161.     public class CSoldOutState : IState
  162.     {
  163.         //construct
  164.         public CSoldOutState(CGumballMachine objGmMachine)
  165.         {
  166.             this.m_objGbMachine = objGmMachine;
  167.         }
  168.         //inhert from IState
  169.         public string InsertQuarter()
  170.         {
  171.             return "You can't insert a quarter, the machine is sold out/n";
  172.         }
  173.         public string EjectQuarter()
  174.         {
  175.             return "You can't eject, you haven't inserted a quarter yet/n";
  176.         }
  177.         public string TurnCrank()
  178.         {
  179.             return "Sorry, you already turned the crank/n";
  180.         }
  181.         public string Dispense()
  182.         {
  183.             string strOutput;
  184.             strOutput = this.m_objGbMachine.ReleaseBall();
  185.             strOutput += "You turned, but there are no gumballs/n";
  186.             return strOutput;
  187.         }
  188.         public override string  ToString()
  189.         {
  190.              return "sold out";
  191.         }
  192.         private CGumballMachine m_objGbMachine;
  193.     };
  194.     public class CNoQuarterState : IState
  195.     {
  196.         //construct
  197.         public CNoQuarterState(CGumballMachine objGmMachine)
  198.         {
  199.             this.m_objGbMachine = objGmMachine;
  200.             this.m_stateHasQuarter = new CHasQuarterState(this.m_objGbMachine);
  201.         }
  202.         //inhert from IState
  203.         public string InsertQuarter()
  204.         {
  205.             this.m_objGbMachine.StateOfMechine = this.m_stateHasQuarter;
  206.              return "You inserted a quarter/n";
  207.         }
  208.         public string EjectQuarter()
  209.         {
  210.              return "You haven't inserted a quarter/n";
  211.         }
  212.         public string TurnCrank()
  213.         {
  214.              return "You turned but there's no quarter/n";
  215.         }
  216.         public string Dispense()
  217.         {
  218.             string strOutput;
  219.             strOutput = this.m_objGbMachine.ReleaseBall();
  220.             strOutput += "You need to pay first/n";
  221.         
  222.             return strOutput;
  223.         }
  224.         public override string  ToString()
  225.         {
  226.              return "waiting for quarter";
  227.         }
  228.         private CGumballMachine m_objGbMachine;
  229.         private IState m_stateHasQuarter;
  230.     };
  231.     public class CHasQuarterState : IState
  232.     {
  233.         //construct
  234.         public CHasQuarterState(CGumballMachine objGmMachine)
  235.         {
  236.             this.m_objGbMachine = objGmMachine;
  237.             this.m_stateNoQuarter = new CNoQuarterState(this.m_objGbMachine);
  238.         }
  239.         //inhert from IState
  240.         public string InsertQuarter()
  241.         {
  242.             return "You can't insert another quarter/n";
  243.         }
  244.         public string EjectQuarter()
  245.         {
  246.             this.m_objGbMachine.StateOfMechine = this.m_stateNoQuarter;
  247.             return "Quarter returned/n";
  248.         }
  249.         public string TurnCrank()
  250.         {
  251.             string strOutput;
  252.             int nWin = 0;
  253.             Random objRand = new Random();
  254.             strOutput = "You turned.../n";
  255.             nWin = objRand.Next(10);
  256.             if ((0 == nWin) && (this.m_objGbMachine.nCount > 1))
  257.             {
  258.                 this.m_objGbMachine.StateOfMechine = new CWinnerState(this.m_objGbMachine);
  259.             }
  260.             else
  261.             {
  262.                 this.m_objGbMachine.StateOfMechine = new CSoldState(this.m_objGbMachine);
  263.             }
  264.             return strOutput;
  265.         }
  266.         public string Dispense()
  267.         {
  268.             return "No gumball dispensed/n";
  269.         }
  270.         public override string  ToString()
  271.         {
  272.              return "waiting for turn of crank";
  273.         }
  274.         private CGumballMachine m_objGbMachine;
  275.         private IState m_stateNoQuarter;
  276.     };
  277.     public class CWinnerState : IState
  278.     {
  279.         //construct
  280.         public CWinnerState(CGumballMachine objGmMachine)
  281.         {
  282.             this.m_objGbMachine = objGmMachine;
  283.             this.m_stateNoQuarter = new CNoQuarterState(this.m_objGbMachine);
  284.             this.m_stateSoldOut = new CSoldOutState(this.m_objGbMachine);
  285.         }
  286.         //inhert from IState
  287.         public string InsertQuarter()
  288.         {
  289.             return "Please wait, we're already giving you a gumball/n";
  290.         }
  291.         public string EjectQuarter()
  292.         {
  293.             return "Sorry, you already turned the crank/n";
  294.         }
  295.         public string TurnCrank()
  296.         {
  297.              return "Turning twice doesn't get you another gumball!/n";
  298.         }
  299.         public string Dispense()
  300.         {
  301.             string strOutput;
  302.             strOutput = "YOUR A WINNER! You get two gumballs for your quarter/n";
  303.             strOutput += this.m_objGbMachine.ReleaseBall();
  304.             if (0 == this.m_objGbMachine.nCount)
  305.             {
  306.                 this.m_objGbMachine.StateOfMechine = this.m_stateSoldOut;
  307.             }
  308.             else
  309.             {
  310.                 strOutput += this.m_objGbMachine.ReleaseBall();
  311.                 if (this.m_objGbMachine.nCount > 0)
  312.                 {
  313.                     this.m_objGbMachine.StateOfMechine = this.m_stateNoQuarter;
  314.                 }
  315.                 else
  316.                 {
  317.                     strOutput += "Oops, out of gumballs!/n";
  318.                     this.m_objGbMachine.StateOfMechine = this.m_stateSoldOut;
  319.                 }
  320.             }
  321.             return strOutput;
  322.         }     
  323.   
  324.         public override string ToString()
  325.         {
  326.             return "";
  327.         }
  328.         private CGumballMachine m_objGbMachine;
  329.         private IState m_stateNoQuarter;
  330.         private IState m_stateSoldOut;
  331.     };
  332. }

 

【上篇】
【下篇】

抱歉!评论已关闭.