Classe di contesto nel modello di strategia


10

Sto cercando di capire il modello di strategia e mi chiedo: la classe di contesto è indispensabile o posso lasciarla fuori senza compromettere lo scopo del modello?

Avevo l'impressione di aver bisogno di una sorta di interruttore per leggere diversi tipi di file, ma non volevo solo hackerare qualcosa e successivamente occuparmi di refactoring (anche se, ovviamente, capita sempre che il codice possa essere refactored ma l'idea era: provare per essere il più intelligente possibile nel design in anticipo ...):

inserisci qui la descrizione dell'immagine

Immagine tratta da Wikimedia

Il client può delegare direttamente all'interfaccia di strategia o c'è qualcosa che ho appena mancato di comprendere 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 raffigurata manca la classe di contesto. Il codice aderisce al modello di strategia?


1
Come altro punto interessante / importante, vorrei portare alla vostra attenzione che il concetto di classi di tipi in linguaggi funzionali è "semplicemente" il modello di strategia con tipi en.wikipedia.org/wiki/Kind_(type_theory) ). Entrambi sono solo un meccanismo di attuazione per il polimorfismo ad hoc.
AndreasScheinert,

Questo (molto o meno) è correlato a Java 8 Project Lambda? L'articolo di Wikipedia è troppo denso per me solo per capirlo subito ma se questi fanno parte del background teorico per utilizzare in modo efficiente le prossime funzionalità di Java (o la programmazione in generale), ci investirò felicemente più tempo.
panny,

1
Molto lontano, ma direi di sì, le classi di tipo hanno bisogno. Un linguaggio di programmazione che supporta tipi superiori. Questo sarebbe il caso di Scala e Haskell. Il mio punto qui era che il polimorfismo (ad hoc) è implementato in modo diverso e se fai un passo indietro puoi imparare alcune intuizioni sul polimorfismo in generale.
AndreasScheinert,

Risposte:


13

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

Tuttavia, se la tua base di codice passa da una versione alla successiva, è improbabile che vengano chiamati sempre più metodi "strategici" e la decisione sulla strategia da applicare e l'esecuzione dei "metodi strategici" avverrà in momenti diversi e in diversi punti del codice. Quindi inizi a riformattarli per mantenere la logica in un unico posto. Ciò porterà direttamente a un'implementazione che assomiglia al diagramma nella tua domanda.


5

Certamente. I modelli sono solo linee guida. Sarà comunque necessario adattarli e applicarli correttamente per il problema in questione. Personalmente, raramente permetto che la strategia sia impostata in fase di esecuzione; più spesso è specificato su costruzione o filato in una fabbrica.

Anche se si potrebbe anche sostenere che setStrategyè privato e la mia iniezione sta solo usando lo schema come mostrato.


Questo significa che la classe di contesto rappresentata può essere esclusa senza compromettere il modello? O in altri termini, va bene quando la mia classe client è la classe di contesto rappresentata?
panny

6
@panny - Esito a rispondere alla domanda perché indica che hai perso il punto della risposta, e in effetti tutti gli schemi. Il modello di strategia consente di variare il comportamento fornendo diverse implementazioni concrete dietro un'interfaccia. È un concetto , non una formula .
Telastyn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.