状态模式
using System;
using System.Collections.Generic;using System.Linq;using System.Text;namespace State
{ public interface State { //投入25分硬币 void insertQuarter(); //退出硬币 void ejectQuarter(); //推把手 void turnCrank(); //得到糖果 void dispense(); }}
using System;
using System.Collections.Generic;using System.Linq;using System.Text;namespace State
{ public class NoQuarterState : State { GumballMachine gm;public NoQuarterState(GumballMachine g)
{ this.gm = g; }#region State 成员
void State.insertQuarter()
{ System.Console.WriteLine("您刚才投入了25分钱"); gm.setState(gm.hasQuarterState); }void State.ejectQuarter()
{ System.Console.WriteLine("您没有投币"); }void State.turnCrank()
{ System.Console.WriteLine("您没有投币"); }void State.dispense()
{ System.Console.WriteLine("您没有投币"); }#endregion
}}
using System;
using System.Collections.Generic;using System.Linq;using System.Text;namespace State
{ public class soldOutState :State { GumballMachine gm;public soldOutState(GumballMachine g)
{ this.gm = g; }#region State 成员
void State.insertQuarter()
{ System.Console.WriteLine("已售完,不接受投币"); }void State.ejectQuarter()
{ System.Console.WriteLine("已售完,不接受退币"); }void State.turnCrank()
{ System.Console.WriteLine("已售完!不可摇杆"); }void State.dispense()
{ System.Console.WriteLine("已售完!"); }#endregion
}}
using System;
using System.Collections.Generic;using System.Linq;using System.Text;namespace State
{ public class SoldState:State { GumballMachine gm;public SoldState(GumballMachine g)
{ this.gm = g; }#region State 成员
void State.insertQuarter()
{ System.Console.WriteLine("等待出果,不得投币"); }void State.ejectQuarter()
{ System.Console.WriteLine("等待出果,不得退币"); }void State.turnCrank()
{ System.Console.WriteLine("等待出果,不得摇两次"); }void State.dispense()
{ //System.Console.WriteLine("您的糖果,请笑纳");//gm.releaseBall();
if (gm.count > 0)
{ gm.setState(gm.noQuarterState); } else { gm.setState(gm.soldOutState); } }#endregion
}}
using System;
using System.Collections.Generic;using System.Linq;using System.Text;namespace State
{ public class WinnerState:State { GumballMachine gm;public WinnerState(GumballMachine g)
{ this.gm = g; }#region State 成员
void State.insertQuarter()
{ System.Console.WriteLine("等待出果,不得投币"); }void State.ejectQuarter()
{ System.Console.WriteLine("等待出果,不得退币"); }void State.turnCrank()
{ System.Console.WriteLine("等待出果,不得摇两次"); }void State.dispense()
{ System.Console.WriteLine("您赢了一颗果!"); if (gm.count > 0) { gm.setState(gm.noQuarterState); } else { gm.setState(gm.soldOutState); } }#endregion
}}
using System;
using System.Collections.Generic;using System.Linq;using System.Text;namespace State
{ public class GumballMachine { public State soldOutState; public State noQuarterState; public State hasQuarterState; public State soldState; public State winnerState;State state ;
//糖果数量 public int count = 0;public GumballMachine(int num)
{ soldOutState = new soldOutState(this); noQuarterState = new NoQuarterState(this); hasQuarterState = new hasQuarterState(this); soldState = new SoldState(this); soldState = new WinnerState(this); if (num > 0) this.count = num;state = noQuarterState;
}
public void insert()
{ state.insertQuarter(); } public void eject() { state.ejectQuarter(); }public void turn()
{ state.turnCrank(); } public void setState(State s) { this.state = s; }public void releaseBall()
{ if (state == soldState) { System.Console.WriteLine("箱子提醒您:请查收糖果!"); state.dispense(); } else { System.Console.WriteLine("箱子提醒您:摇杆后取果!"); }if (count != 0)
{ count--; }}
}
}
using System;
using System.Collections.Generic;using System.Linq;using System.Text;namespace State
{ public class hasQuarterState : State { GumballMachine gm;public hasQuarterState(GumballMachine g)
{ this.gm = g; }#region State 成员
void State.insertQuarter()
{ System.Console.WriteLine("您已经投了25分钱,不用再投"); }void State.ejectQuarter()
{ System.Console.WriteLine("这是您的25分,请收取"); gm.setState(gm.noQuarterState); }void State.turnCrank()
{ System.Console.WriteLine("请等待糖果"); gm.setState(gm.soldState); }void State.dispense()
{ System.Console.WriteLine("请等待糖果!"); }#endregion
}}
using System;
using System.Collections.Generic;using System.Linq;using System.Text;namespace State
{ class Program { static void Main(string[] args) { GumballMachine g = new GumballMachine(5);g.insert();
g.eject(); g.turn(); g.releaseBall(); g.turn();g.insert();
g.turn(); g.releaseBall();g.insert();
g.turn(); g.releaseBall();g.insert();
g.turn(); g.releaseBall();g.insert();
g.turn(); g.releaseBall();g.insert();
g.turn(); g.releaseBall();g.insert();
g.turn(); g.releaseBall();System.Console.ReadLine();
} }}