Domanda

Qual è la differenza tra il modello di strategia e il modello di delega (non i delegati)?

È stato utile?

Soluzione

il modello di strategia è una soluzione di progettazione molto specifica per un problema software comune. il modello di strategia implica che ci sarà

  • un'interfaccia chiamata Strategia (o con Strategia come parte del nome). questa interfaccia dovrebbe avere un metodo chiamato execute ().
  • una o più classi concrete hanno chiamato qualcosa come ConcreteStrategyA, ConcreteStrategyB, ecc. che implementano l'interfaccia della strategia.
  • dovrebbe esserci anche una classe di contesto che contiene la Strategia

la delega è più un'entità che uno schema. la delega implica che invece di avere un singolo oggetto responsabile di tutto, delega le responsabilità ad altri oggetti. il motivo per cui questa è una tecnica comune è che impone due principi ancora più fondamentali dello sviluppo del software riducendo l'accoppiamento e aumentando la coesione.

Detto questo, non preoccuparti degli schemi. Concentrati sui principi e se ritieni che la tua soluzione possa essere migliorata, osserva gli schemi per vedere se esiste una trappola per topi migliore. Se ti concentri sugli schemi anziché sui principali, ti ritroverai perso in tutti gli schemi e implementandoli per motivi di implementazione degli schemi ...

Altri suggerimenti

" delegazione " non è in realtà un modello di progettazione, è piuttosto una tecnica di programmazione generale, in cui il componente A delega l'attività (qualunque tipo di attività che potrebbe essere) al componente B. La delega può essere utilizzata in molti contesti.

Il modello di strategia, d'altra parte, è un modello specifico che di solito fa un uso pesante della delega come dettaglio di implementazione.

Ad esempio, è possibile implementare il modello di strategia e invocarlo utilizzando

strategy.execute(x)

Il modello di strategia prevede varie implementazioni dell'interfaccia di strategia e la selezione dell'implementazione appropriata in fase di esecuzione. L'atto di invocare tale attuazione è una delega.

Quindi non è né / o, i concetti sono gratuiti.

Ecco un pensiero:

I delegati imitano la classe delegante (almeno quando li ho usati, non sono sicuro se questo è il modo canonico o meno, ma è così che lo faccio di solito). Quindi, fondamentalmente, se avessi una classe con più punti di ingresso (metodi) e volessi cambiare l'implementazione in fase di esecuzione, creerei delegati per implementare la stessa interfaccia.

Se, d'altra parte, avessi una parte di una classe che voglio essere in grado di scambiare in fase di esecuzione, creerei classi di strategia con una singola interfaccia di metodo (ad es. executeCalculation) e ne farei un componente aggregato di la classe contenente.

Quindi, in sintesi, una strategia comprende un singolo comportamento, i delegati implementano un insieme di comportamenti e si possono usare i delegati per implementare strategie.

se intendevi modello di strategia contro delegati, come in funzioni / lambda passati come argomenti, allora almeno so che c'è meno sovraccarico in termini di classi che devono essere compilate per i delegati.

In realtà ho trovato questa pagina in cerca di qualcuno che mi dia la propria opinione sui vantaggi di continuare a utilizzare il percorso del modello di progettazione dato che sia java 8 che C # ora supportano le funzioni di passaggio come argomenti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top