Sia qui nello stack overflow che in Java Efficace è suggerito che i pattern di progettazione della strategia dovrebbero essere apolidi. Infatti nel libro si suggerisce anche di rendere ogni oggetto strategico un singleton.
Il problema che ho è che alcune strategie che immagino per il mio programma hanno bisogno di stati / campi. O perché sono path-dependent nel loro comportamento o perché li voglio eterogenei (una distribuzione statistica di strategie simili, se preferisci).
Questo mi costringe a infrangere entrambi i suggerimenti efficaci di Java: istanzio una nuova strategia per ogni classe utente E ciascuna di queste strategie contiene i propri campi.
È molto brutto? Dovrebbe essere fatto in modo diverso?
Mi è stato suggerito di mantenere i campi che rendono la strategia eterogenea nella classe che la usa e poi passarla come argomento. Lo trovo molto anti-oo. Questi campi non appartengono alla classe utente. Infatti, se quella classe usa un'altra strategia, potrebbe non aver bisogno di quei campi. Ciò sembra andare contro la ragione per cui sto usando il modello strategico in primo luogo.
Per lo più sono solo molto confuso
Faccio un semplice esempio qui. Immagina di avere un giocatore di classe, che rappresenta qualcuno che fa scommesse sui cavalli. Ora questa classe richiederà una strategia per prevedereStrategy che funzioni in questo modo:
interface predictStrategy{
public Horse predictWinningHorse(HorseRace r);
}
Ora, posso avere molte implementazioni in cui la strategia è scegliere a caso, o scegliere il cavallo bianco o qualsiasi altra cosa. Questo è facile.
Immaginate di implementare una strategia che guardi le previsioni del passato e in qualche modo "impari" dai suoi errori passati. Chiaramente ogni strategia dovrà avere la propria memoria su cui imparare. Potrei dover aggiungere un altro metodo all'interfaccia (o creare un'estensione)
interface predictStrategy{
public Horse predictWinningHorse(HorseRace r);
public void addObservation(HorseRace r, Horse oldPrediction, Horse actualWinner);
}
In modo che la classe Gambler chiami "strategy.addObservation (...)" alla fine di ogni gara per migliorare il suo potere predittivo.
Può essere veramente essere eseguito con un oggetto di strategia senza stato ? Mi sembra impossibile.