2012-08-07 15 views
13

In che modo il modello di strategia è diverso dall'iniezione di dipendenza?Schema di strategia contro Iniezione di dipendenza

vale a dire al di sotto è quello che si può fare con il modello di strategia:

class Foo{ 
    private readonly ISortAlgo _sortAlgo; 

    public Foo(ISortAlgo sortAlgo) 
    { 
    _sortAlgo = sortAlgo; 
    } 

    public void Sort() 
    { 
    _sortAlgo.sort(); 
    } 

} 

con DI è possibile fare lo stesso, in sostanza, si può avere costruttore, setter, l'iniezione di interfaccia ecc. e darebbe lo stesso effetto del modello di strategia. Sono consapevole del fatto che il DI è anche impostato su altri principi, come l'accoppiamento libero, la testabilità, il cablaggio ecc.

In termini di implementazione non vedo molta differenza.

qual è la differenza tra il modello di strategia e DI?

+0

Le risposte attuali non sono particolarmente soddisfacenti. Risposte migliori si concentrerebbero pragmaticamente sulle differenze in cui i comportamenti delle variabili vengono iniettati in fase di esecuzione. – Mario

risposta

14

Innanzitutto, iniezione di dipendenza ha non solo costruttore iniezione come metodo per iniettare, ma anche struttura, metodo di iniezione contesto e ambiente.

In secondo luogo, stategy definisce comportamento, in modo cliente potrebbe scegliere uno speciale che corrisponde ai suoi bisogni. Mentre l'iniezione di dipendenza funziona con l'astrazione di dipendenze esterne.

+1

+1. Per menzionare * comportamento *. –

+1

+1 per un bel riassunto. Penso che un po 'di confusione sia dovuta al fatto che le due PS usano gli stessi meccanismi ma hanno portata e intenti diversi. –

12

Strategy pattern consente di selezionare il comportamento di un oggetto (ad esempio i relativi algoritmi) in fase di esecuzione, dove come Dependency injection consente la rimozione delle dipendenze codificate.

Non sono quindi concorrenti. Le loro implementazioni potrebbero essere simili, ma il loro obiettivo è diverso.

+1

"passato a un metodo, ma questo non è considerato come DI". Correzione: DI è disponibile in più forme. Il costruttore è la forma più comune (e spesso l'opzione migliore), ma l'iniezione del metodo è anche una forma di Iniezione delle dipendenze. – Steven

+0

Considereresti anche DI se è stato passato a un metodo solo per eseguire un'azione (il caso che avevo in mente) e non per inizializzare una classe? –

+0

La dipendenza viene iniettata nel metodo, quindi Sì, è una forma di iniezione delle dipendenze. Tuttavia, l'iniezione del metodo è in genere un modo molto fragile di iniezione delle dipendenze, poiché la dipendenza deve essere parte del contratto e sarà difficile passare le dipendenze dal metodo al metodo al metodo verso il basso nello stack delle chiamate. – Steven

6

La strategia consente di modificare il comportamento di un oggetto. DI è uno schema di progettazione che ti consente di dipendere dalle astrazioni.

4

Iniezione di dipendenza è uno schema che consente di dividere la logica di forma di costruzione, ideale per il test e l'estensibilità del sistema. Può anche essere usato in luogo dove altri picchietti si adattano ad es. Singleton.

Il modello di strategia risolve un problema diverso. Permette al runtime di scegliere l'algoritmo - in OOP attraverso il polimorfismo.

Sicuramente, possono lavorare insieme.