Classe di contesto nel modello di strategia

10

Sto cercando di capire il modello di strategia e mi sto chiedendo: la classe di contesto deve avere o posso lasciarla fuori senza compromettere lo scopo del modello?

Avevo l'impressione che avessi bisogno di un qualche tipo di interruttore per leggere diversi tipi di file, ma non volevo semplicemente hackerare qualcosa e poi trattare con il refactoring (anche se, naturalmente, accade sempre che il codice possa essere refactored ma l'idea era: cerca di essere il più intelligente possibile nel design in anticipo ...):

Immaginetrattada wikimedia

Il cliente può delegare direttamente all'interfaccia della strategia o c'è qualcosa che mi è mancato di capire sulla classe di contesto?

interface Reader {
    // read information from file and fill data list field of Client
    readFile();
}
class ExcelReader implements Reader{ /* */ }
class PdfReader implements Reader{ /* */}

class Client{
    // strategic choice
    Reader r;

    // data list field
    List<Data> data;

    // Client Constructor
    public Client(){
        if(<file ends in .xls>)
            r = new ExcelReader();
        else
            r = new PdfReader();
        r.readFile();
    }
}

Quindi, sopra raffigurato manca la classe di contesto. Il codice aderisce al modello di strategia?

    
posta panny 18.02.2013 - 01:05
fonte

2 risposte

13

Nel tuo esempio, il codice che chiama readFile fa parte del costruttore Client. Questo metodo è il "contesto" che stai cercando . Il modello di strategia non ha bisogno di una "classe di contesto" letteralmente, e alla prima versione del codice l'oggetto strategia (il "Reader" nel tuo caso) può risiedere solo in una variabile locale. Soprattutto quando c'è un solo "metodo strategico" ("readFile") da chiamare.

Tuttavia, se il tuo codebase cresce da una versione all'altra, non è improbabile che vengano chiamati sempre più metodi "strategici", e la decisione su quale strategia applicare e l'esecuzione dei "metodi strategici" avverrà in momenti diversi e in punti diversi del codice. Quindi inizi a rifattenerli per mantenere la logica in un unico posto. Ciò condurrà direttamente a un'implementazione simile al diagramma nella tua domanda.

    
risposta data 19.02.2013 - 16:47
fonte
5

Certamente. I modelli sono solo linee guida. Dovrai comunque adattarti e applicarli correttamente per il problema in questione. Personalmente, raramente permetto alla strategia di essere impostata in fase di runtime; più spesso è specificato sulla costruzione o su una fabbrica.

Anche se si potrebbe obiettare che setStrategy è privato e la mia iniezione sta semplicemente usando il modello come mostrato.

    
risposta data 18.02.2013 - 01:57
fonte

Leggi altre domande sui tag