用設計模式固化你的C#程序(5-1)
Design Patterns: Solidify Your C# Application Architecture with Design Patterns中文版(尾篇一)
作者:Samir Bajaj
譯者:榮耀
【譯注:以下是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!
*/