Considerare un programma, in cui l'utente sceglie un algoritmo da un elenco, e il modello di strategia viene utilizzato per impostare questo algoritmo come operazione del modello.
Ad esempio, un'applicazione di processione di immagini. Esistono numerosi algoritmi che possono essere utilizzati per manipolare un'immagine (scurire, illuminare, contrastare, ecc.). Sono tutti incapsulati in oggetti e il controllore imposta il modello per utilizzare un algoritmo da questo elenco. Gli algoritmi devono anche essere presentati per nome nell'interfaccia utente.
Ecco come funzionerà:
L'utente può selezionare un algoritmo da un elenco sulla GUI. Quando lo fa, il controllore riceve una notifica e imposta l'algoritmo adatto nel modello. Successivamente, quando il modello è chiamato model.operate()
, delegherà l'operazione al suo attuale algoritmo. Modello di strategia classica.
Inoltre, la vista ha bisogno di accedere ai nomi degli algoritmi , in modo da consentire all'utente di sceglierne uno da una lista.
La mia domanda è questa:
Devo memorizzare gli algoritmi da qualche parte, dove il controller li preleverà da quando è necessario impostare un algoritmo nel modello? O il controller dovrebbe semplicemente istanziare un nuovo algoritmo ogni volta che è necessario impostare un algoritmo nel modello?
Se la risposta è che è bene memorizzare gli algoritmi da qualche parte - rispetto a dove?
Nel modello? - ha senso perché il modello incapsula la logica aziendale e i dati dell'app. Ma in che modo la vista preleverà i nomi degli algoritmi?
Nel controller? - ha senso perché il controller è quello che imposta gli algoritmi nel modello. E inoltre può offrire alla vista un metodo getAlgorithmNames()
. Ma tecnicamente non dovrebbe contenere oggetti di business logic, che è quello che sono gli algoritmi.
In una classe diversa, dove chiunque sia interessato può recuperare gli algoritmi o i loro nomi da?
Sono sicuro che ci sono state molte applicazioni in cui l'utente seleziona un'operazione e l'algoritmo appropriato è impostato nel modello. Come fanno le altre applicazioni a fare questo?