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

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

作者:Samir Bajaj

譯者:榮耀

【譯序:C#進階文章。譯者對Samir提供的C#例子進行了簡單整理(作者提供的某些代碼在譯者的環境中無法通過編譯),並編寫了對應的C++示例,一併置於譯註中,以便讀者比對。譯文中所有C#、C++程序調試環境均爲Microsoft Visual Studio.NET 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 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!

*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章