DESIGN PATTERN: STRATEGY
Lo Strategy è un pattern comportamentale che permette di definire una
famiglia di algoritmi, incapsularli e renderli intercambiabili a runtime
senza modificare il contesto che li utilizza.
In pratica, consente di cambiare il “comportamento” di un oggetto in modo flessibile.
QUANDO USARLO
- Più algoritmi alternativi devono essere scelti dinamicamente.
- Vuoi evitare lunghi
if-elseoswitch-casepieni di logica condizionale. - Vuoi rispettare l’Open/Closed Principle: estendere il comportamento senza modificare il codice esistente.
VANTAGGI
- Possibilità di aggiungere nuovi algoritmi senza modificare il codice principale.
- Migliora leggibilità eliminando
if/switchcomplessi. - Promuove la composizione invece dell’ereditarietà.
- Algoritmi intercambiabili a runtime.
POTENZIALI SVANTAGGI
- Aumenta il numero di classi/funzioni (una per strategia).
- Il contesto deve conoscere l’interfaccia comune.
- Più complesso rispetto a una semplice funzione inline per problemi banali.
CODICE
/**
* Strategy astratta comune
*/
interface Strategy {
esegui(a: number, b: number): number;
}
/**
* Strategy concrete
*/
class StrategiaAddizione implements Strategy {
esegui(a: number, b: number): number {
return a + b;
}
}
/**
* Strategy concrete
*/
class StrategiaSottrazione implements Strategy {
esegui(a: number, b: number): number {
return a - b;
}
}
/**
* Strategy concrete
*/
class StrategiaMoltiplicazione implements Strategy {
esegui(a: number, b: number): number {
return a * b;
}
}
/**
* STRATEGY
* Classe che utilizza una strategia interna
*/
class Calcolatrice {
private StrategiaCalcolo: Strategy;
constructor(strategia: Strategy) {
this.StrategiaCalcolo = strategia;
}
setStrategia(strategia: Strategy): void {
this.StrategiaCalcolo = strategia;
}
eseguiStrategia(a: number, b: number): number {
return this.StrategiaCalcolo.esegui(a, b);
}
}
// USO STRATEGY
const calcolatrice = new Calcolatrice(new StrategiaAddizione());
console.log("Risultato:", calcolatrice.eseguiStrategia(5, 3));
calcolatrice.setStrategia(new StrategiaSottrazione());
console.log("Risultato:", calcolatrice.eseguiStrategia(5, 3));
calcolatrice.setStrategia(new StrategiaMoltiplicazione());
console.log("Risultato:", calcolatrice.eseguiStrategia(5, 3));