CSDN博客

img optimizer

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

发表于2002/1/9 10:43:00  572人阅读

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

作者: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!

*/

0 0

相关博文

我的热门文章

img
取 消
img