Usare il pattern Strategy in C#

Mattepuffo's logo
Usare il pattern Strategy in C#

Usare il pattern Strategy in C#

Il pattern Strategy fa parte dei behavioral design pattern, e permette di definire una famiglia di "algoritmi" e renderli facilmente interscambiabili.

In sostanza possiamo richiamare un algoritmo, farci delle operazioni, e poi cambiarlo a runtime.

Nel nostro esempio avremo un metodo per la somma e uno per la sottrazione.

Nell'esempio non ho considerato eventuali gestione degli errori (ad esempio la sottrazione non può essere negativa, ecc).

Mi limito ad eseguire le operazioni e cambiarle giusto per vedere il funzionamento di strategy.

Detto ciò vediamone un esempio in C#, cominciando dalla interfaccia a da due implementazioni:

public interface IOperazioneStrategy
{
    double Operazione(double valore);
}

public class SommaStrategy : IOperazioneStrategy
{
    public double Operazione(double valore)
    {
        return valore + 13;
    }
}

public class SottrazioneStrategy : IOperazioneStrategy
{
    public double Operazione(double valore)
    {
        return valore - 13;
    }
}

Nulla di particolare.

Qui sotto la classe che fa la magia:

public class OperazioneCtx
{
    private IOperazioneStrategy _operazioneStrategy;

    public OperazioneCtx(IOperazioneStrategy operazioneStrategy)
    {
        _operazioneStrategy = operazioneStrategy;
    }

    public double EseguieStrategy(double valore)
    {
        return _operazioneStrategy.Operazione(valore);
    }

    public void CambiaStrategy(IOperazioneStrategy strategy)
    {
        _operazioneStrategy = strategy;
    }
}

In sostanza ha due metodi:

  • uno per esegure l'algoritmo scelto
  • l'altro per cambiarlo

A questo punto richiamiamo tutto così:

public class MainClass
{
    public static void Main(string[] args)
    {
        var ctx = new OperazioneCtx(new SommaStrategy());
        double res = ctx.EseguieStrategy(10);
        Console.WriteLine(res);

        ctx.CambiaStrategy(new SottrazioneStrategy());
        res = ctx.EseguieStrategy(70);
        Console.WriteLine(res);
    }

}

Enjoy!


Condividi

Commentami!