Die Hochzeit von enum und Strategy pattern

Vor kurzem war ich auf der Suche nach einer Alternative zum üblichen SwitchCase-Verfahren bei Enumerationen.
Thomas Mentzel hat in seiner “Pattern of the week” Reihe einen sehr schönen anderen Weg über das Strategy Pattern aufgezeigt.
Zuerst hatte ich mich gewundert, denn von einem enum war nichts mehr zu sehen. Er hat Recht, eigentlich braucht man sie nicht.
Eigentlich – was aber wenn doch? Bei StackOverflow bin ich fündig geworden. Hier ist meine eigene Variante der Hochzeit von enum und Strategy Pattern.

namespace EnumMarriesStrategyPattern
{
   using SomeOtherComponent;

   internal class Program
   {
      private static void Main()
      {
         new SomeHandler().ChooseWay(WaysToGo.ThisWay).Go();
         // Output: Going this way.
      }
   }
}

//======================================================================
//======================================================================

namespace SomeOtherComponent
{
   using System;
   using System.Collections.Generic;

   public enum WaysToGo
   {
      NoWay,
      ThisWay,
      ThatWay
   }

   //======================================================================

   public class SomeHandler
   {
      private readonly Dictionary<WaysToGo, IWayToGoStrategy> strategies;

      internal SomeHandler()
      {
         strategies = new Dictionary<WaysToGo, IWayToGoStrategy>
                    {
                       {WaysToGo.NoWay, new NoWayStrategy()},
                       {WaysToGo.ThatWay, new ThatWayStrategy()},
                       {WaysToGo.ThisWay, new ThisWayStrategy()}
                    };
      }

      public IWayToGoStrategy ChooseWay(WaysToGo wayToGo)
      {
         return strategies[wayToGo];
      }
   }

   //======================================================================

   public interface IWayToGoStrategy
   {
      void Go();
   }

   internal class NoWayStrategy : IWayToGoStrategy
   {
      public void Go()
      {
         throw new NotSupportedException("That's no way to go!");
      }
   }

   internal class ThisWayStrategy : IWayToGoStrategy
   {
      public void Go()
      {
         Console.WriteLine("Going this way.");
      }
   }

   internal class ThatWayStrategy : IWayToGoStrategy
   {
      public void Go()
      {
         Console.WriteLine("Going that way.");
      }
   }
}
DotNetKicks-DE Image
Published Sonntag, 2. Januar 2011 23:22 von Rainer Hilmer

Kommentare

# Die Hochzeit von enum und Strategy pattern

Montag, 3. Januar 2011 16:34 von dotnet-kicks.de

Sie wurden gekickt (eine gute Sache) - Trackback von dotnet-kicks.de

# Functional Dictionary - wofür braucht man das?

Dienstag, 25. Januar 2011 20:02 von Rainer Hilmers Developer-Blog

Hallo Community, mein Artikel über die Verbindung von Enumerationen und Dictionaries zu einer Variante

# re: Die Hochzeit von enum und Strategy pattern

Dienstag, 1. März 2011 13:34 von Andy Stumpp

Sehr schön, das habe ich gesucht. Scheint für automatisierte Tests auch die bessere Lösung zu sein, da überflüssige Pfade rausfliegen.

Kommentar abgeben

(verpflichtend) 
(verpflichtend) 
(optional)
(verpflichtend)