Design Patterns: Solidify Your C# Application Architecture with Design Patterns中文版(尾篇一) (轉)

worldblog發表於2007-12-15
Design Patterns: Solidify Your C# Application Architecture with Design Patterns中文版(尾篇一) (轉)[@more@]

Design Patterns: Solidify Your Application Architecture with Design Patterns中文版(尾篇一):namespace prefix = o ns = "urn:schemas--com::office" />

作者:Samir Bajaj

譯者:榮耀

【譯序:C#進階文章。譯者對Samir提供的C#例子進行了簡單整理(作者提供的某些程式碼在譯者的環境中無法透過編譯),並編寫了對應的C++示例,一併置於譯註中,以便讀者比對。譯文中所有C#、C++環境均為Microsoft 7.0 Beta2】

【譯註:以下是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 overr 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!

*/


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993610/,如需轉載,請註明出處,否則將追究法律責任。

相關文章