Articoli di programmazione

Design patterns in pillole: Strategy

Il Design Pattern Strategy permette di eseguire un determinato algoritmo a runtime, selezionato tra più algoritmi alternativi

strategy.gif
Strategy è uno dei pattern che preferisco personalmente. E' la base per design patterns più complessi e incorpora la logica con la quale il 90% dei programmi a oggetti "scritti bene" lavorano.

Supponiamo di avere un'applicazione che gestisca gli ordini e gli scontrini di un pub. Supponiamo inoltre di dover applicare una certa strategia di sconto ad un cliente in base a diversi fattori come ad esempio l'orario (se c'è Happy Hour tutte le birre sono 3 euro!), quanta gente è seduta al tavolo con lui, etc.
Potremmo scrivere una serie di istruzioni condizionali come IF o SWITCH-CASE nella nostra classe che calcola lo sconto, per prevedere tutte le opzioni e dare il risultato desiderato, ma pensandoci bene otterremmo un agglomerato molto lungo e complesso di funzioni, sicuramente poco gestibile e scarsamente manutenibile.

Strategy suggerisce di elaborare un'interfaccia che rappresenti l'algoritmo, in questo caso "ApplicaSconto", e poi implementarla in più classi, ognuna contenente una delle diverse strategie concrete per eseguirla.
Implementiamo quindi l'interfaccia e le due strategie alternative di sconto:

interface IDiscountStrategy
{
void ApplyDiscount(Order o);
}

class StandardDiscount : IDiscountStrategy
{
public void ApplyDiscount(Order o)
{
o.SetDiscount(0);
}
}

class HappyHourDiscount : IDiscountStrategy
{
public void ApplyDiscount(Order o)
{
o.SetDiscount(0.50);
}
}

A questo punto la nostra classe Context, che per noi è il Checkout, si predispone per farsi iniettare la strategia giusta da eseguire a runtime:

class Checkout
{
private readonly IDiscountStrategy strategy;
public Checkout(IDiscountStrategy s)
{
this.strategy = s;
}

public decimal GetTotal(Order o)
{
strategy.ApplyDiscount(o);
return o.Total;
}
}

Come dicevamo, a runtime verrà iniettata la giusta strategia da eseguire per applicare a scontistica e Strategy ha reso estremamente modulare il nostro codice. Possiamo scrivere 1000 strategie diverse di scontistica e la nostra classe Checkout non verrà mai toccata.

#programmazione #designPatterns