扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
【译注:以下是state模式完整示例
C#示例:
using System;
abstract class State
{
public virtual void AddNickel(VendingMachine vm) { }
public virtual void AddDime(VendingMachine vm) { }
public virtual void AddQuarter(VendingMachine vm) { }
protected virtual void ChangeState(VendingMachine vm, State s)
{
vm.ChangeState(s);
}
}
class VendingMachine
{
private State state;
public VendingMachine()
{
Console.WriteLine("The Vending Machine is now online: product costs 25c");
state = Start.Instance();
}
public void ChangeState(State to)
{
state = to;
}
public void Vend()
{
// 发饮料
Console.WriteLine("Dispensing product...Thank you!");
}
public void AddNickel()
{
state.AddNickel(this);
}
public void AddDime()
{
state.AddDime(this);
}
public void AddQuarter()
{
state.AddQuarter(this);
}
}
class Start : State
{
private static State state = new Start();
private Start()
{
}
public static State Instance()
{
// singleton逻辑
Console.WriteLine("Credit: 0c");
return state;
}
public override void AddNickel(VendingMachine vm)
{
ChangeState(vm, Five.Instance());
}
public override void AddDime(VendingMachine vm)
{
ChangeState(vm, Ten.Instance());
}
public override void AddQuarter(VendingMachine vm)
{
vm.Vend();
}
}
class Five : State
{
private static State state = new Five();
private Five()
{
}
public static State Instance()
{
// singleton 逻辑
Console.WriteLine("Credit: 5c");
return state;
}
public override void AddNickel(VendingMachine vm)
{
ChangeState(vm, Ten.Instance());
}
public override void AddDime(VendingMachine vm)
{
ChangeState(vm, Fifteen.Instance());
}
public override void AddQuarter(VendingMachine vm)
{
vm.Vend();
ChangeState(vm, Start.Instance()); // no change returned :-)
}
}
class Ten : State
{
private static State state = new Ten();
private Ten()
{
}
public static State Instance()
{
// singleton 逻辑
Console.WriteLine("Credit: 10c");
return state;
}
public override void AddNickel(VendingMachine vm)
{
ChangeState(vm, Fifteen.Instance());
}
public override void AddDime(VendingMachine vm)
{
ChangeState(vm, Twenty.Instance());
}
public override void AddQuarter(VendingMachine vm)
{
vm.Vend();
ChangeState(vm, Start.Instance()); // no change returned :-)
}
}
class Fifteen : State
{
private static State state = new Fifteen();
private Fifteen()
{
}
public static State Instance()
{
// singleton 逻辑
Console.WriteLine("Credit: 15c");
return state;
}
public override void AddNickel(VendingMachine vm)
{
ChangeState(vm, Twenty.Instance());
}
public override void AddDime(VendingMachine vm)
{
vm.Vend();
ChangeState(vm, Start.Instance());
}
public override void AddQuarter(VendingMachine vm)
{
vm.Vend();
ChangeState(vm, Start.Instance()); // no change returned :-)
}
}
class Twenty : State
{
private static State state = new Twenty();
private Twenty()
{
}
public static State Instance()
{
// singleton 逻辑
Console.WriteLine("Credit: 20c");
return state;
}
public override void AddNickel(VendingMachine vm)
{
vm.Vend();
ChangeState(vm, Start.Instance());
}
public override void AddDime(VendingMachine vm)
{
vm.Vend();
ChangeState(vm, Start.Instance());
}
public override void AddQuarter(VendingMachine vm)
{
vm.Vend();
ChangeState(vm, Start.Instance()); // no change returned :-)
}
}
class Application
{
public static void Main()
{
int coin = 0;
string input = null;
VendingMachine vm = new VendingMachine();
while (true)
{
Console.Write("Insert a coin (5, 10, 25): ");
input = Console.ReadLine();
coin = Int32.Parse(input);
switch (coin)
{
case 5:
vm.AddNickel();
break;
case 10:
vm.AddDime();
break;
case 25:
vm.AddQuarter();
break;
default:
break;
}
}
}
}
/*以下是某次运行时输出结果:
The Vending Machine is now online: product costs 25c
Credit: 0c
Insert a coin <5, 10, 25>: 5
Credit: 5c
Insert a coin <5, 10, 25>: 10
Credit: 15c
Insert a coin <5, 10, 25>: 5
Credit: 20c
Insert a coin <5, 10, 25>: 5
Dispensing product...Thank you!
*/
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者