JavaRush /Java Blog /Random-IT /Differenza tra modelli di stato e strategia in Java
0xFF
Livello 9
Донецк

Differenza tra modelli di stato e strategia in Java

Pubblicato nel gruppo Random-IT
Per utilizzare correttamente i modelli State e Strategy nelle applicazioni Java principali, è importante che i programmatori Java comprendano chiaramente la differenza tra loro. Sebbene entrambi i modelli, Stato e Strategia, abbiano una struttura simile, e siano entrambi basati sul principio aperto/chiuso, che rappresenta la “O” nei principi SOLID , hanno intenti completamente diversi . Differenza tra modelli di stato e strategia in Java - 1Il modello Strategy in Java viene utilizzato per incapsulare set di algoritmi correlati per fornire flessibilità di esecuzione al client. Il client può scegliere qualsiasi algoritmo in fase di esecuzione senza modificare il contesto della classe che utilizza Strategy. Alcuni esempi popolari del modello Strategy sono la scrittura di codice che utilizza algoritmi, come crittografia, compressione o ordinamento. D'altra parte, il modello State consente a un oggetto di comportarsi diversamente in stati diversi. Poiché nel mondo reale un oggetto ha spesso stati e si comporta diversamente in stati diversi, ad esempio un distributore automatico vende merci solo se si trova nello stato hasCoin, non vende finché non ci metti una moneta. Ora puoi vedere chiaramente la differenza tra il modello della Strategia e quello dello Stato, si tratta di intenzioni diverse. Il pattern State aiuta un oggetto a gestire lo stato, mentre il pattern Strategy consente al client di scegliere un comportamento diverso. Un’altra differenza che non è così facile da vedere è chi guida il cambiamento nel comportamento. Nel caso del pattern Strategy si tratta di un client che fornisce diverse strategie al contesto; nel pattern State la transizione è controllata dal contesto o dallo stato dell'oggetto stesso. Inoltre, se gestisci tu stesso i cambiamenti di stato nell'oggetto State, deve esserci un riferimento al contesto, ad esempio un distributore automatico deve essere in grado di chiamare un metodo setState()per modificare lo stato corrente del contesto. D'altro canto l'oggetto Strategy non contiene mai un riferimento al contesto; è il client stesso a passare al contesto la Strategia da lui scelta. La differenza tra i pattern State e Strategy è una delle domande più popolari nelle interviste sui pattern Java , in questo articolo sui pattern Java la vedremo più da vicino. Esploreremo alcune somiglianze e differenze tra i modelli Strategia e Stato in Java che ti aiuteranno a migliorare la tua comprensione di questi modelli.

Somiglianze tra i modelli di Stato e di Strategia

Se guardi il diagramma UML dei pattern Stato e Strategia, noterai che entrambi sembrano simili tra loro. Un oggetto che utilizza State per modificare il proprio comportamento è noto come Contextoggetto, analogamente un oggetto che utilizza Strategy per modificare il proprio comportamento viene definito Contextoggetto. Ricorda che il client interagisce con Contextl'oggetto. Nel caso del pattern State, il contesto delega i metodi di chiamata a un oggetto State, che viene mantenuto come oggetto corrente, e nel caso del pattern Strategy, il contesto utilizza l'oggetto Strategy come parametro o viene fornito durante la creazione del contesto dell'oggetto. Diagramma UML del modello State in Java Differenza tra modelli di stato e strategia in Java - 2 Questo diagramma UML per il modello State descrive il classico problema della creazione di un progetto di distributore automatico orientato agli oggetti in Java. Puoi vedere che lo stato del distributore automatico è rappresentato utilizzando un'interfaccia, che poi ha un'implementazione per rappresentare lo stato specifico. Ogni stato ha anche riferimenti al contesto dell'oggetto per effettuare una transizione a un altro stato come risultato di azioni richiamate nel contesto. Diagramma UML del pattern Strategy in Java Differenza tra modelli di stato e strategia in Java - 3 Questo diagramma UML per il pattern Strategy contiene una sorta di implementazioni funzionali. Poiché esistono molti algoritmi di ordinamento, questo modello di progettazione consente al cliente di scegliere un algoritmo durante l'ordinamento degli oggetti. In effetti, il framework Java Collection utilizza questo modello per implementare un metodo Collections.sort()utilizzato per ordinare gli oggetti in Java. L'unica differenza è che invece di consentire al client di scegliere un algoritmo di ordinamento, gli consente di specificare la strategia di confronto passando un'istanza dell'interfaccia Comparator o Comparable a Java . Diamo un'occhiata ad alcune somiglianze tra questi due principali modelli di progettazione in Java:
  1. Entrambi i modelli, State e Strategy, semplificano l'aggiunta di nuovi stati e strategie senza influenzare il contesto dell'oggetto che li utilizza.

  2. Entrambi mantengono il codice secondo il principio aperto/chiuso , il che significa che il design sarà aperto alle estensioni ma chiuso alle modifiche. Nel caso dei pattern Stato e Strategia, il contesto dell'oggetto è chiuso a modifiche, all'introduzione di nuovi Stati o nuove Strategie, oppure non è necessario modificare il contesto dell'altro stato, o cambiamenti minimi.

  3. Proprio come il contesto dell'oggetto inizia con lo stato di inizializzazione dell'oggetto nel pattern State, anche il contesto dell'oggetto ha una strategia predefinita nel caso del pattern Strategy in Java.

  4. Il modello State rappresenta comportamenti diversi sotto forma di diversi stati dell'oggetto, mentre il modello Strategy rappresenta comportamenti diversi sotto forma di diverse strategie dell'oggetto.

  5. Entrambi i modelli, Strategia e Stato, dipendono da sottoclassi di implementazione del comportamento. Ogni strategia concreta estende una strategia astratta; ogni stato è una sottoclasse di un'interfaccia o classe astratta utilizzata per rappresentare lo stato.

Differenze tra i modelli di strategia e di stato in Java

Quindi ora sappiamo che i modelli Stato e Strategia sono simili nella struttura, ma il loro intento è diverso. Diamo un'occhiata ad alcune differenze chiave tra questi modelli di progettazione.
  1. Il pattern Strategy incapsula una serie di algoritmi correlati e consente al client di utilizzare comportamenti intercambiabili nonostante la composizione e la delega in fase di esecuzione, d'altro canto, il pattern State aiuta una classe a mostrare comportamenti diversi in stati diversi.

  2. La successiva differenza tra i pattern State e Strategy è che State incapsula lo stato di un oggetto, mentre il pattern Strategy incapsula un algoritmo o una strategia. Poiché lo stato è associato a un oggetto, non può essere riutilizzato, ma disaccoppiando una strategia o un algoritmo dal suo contesto possiamo riutilizzarlo.

  3. Nel modello Stato, uno stato personale può contenere un riferimento al contesto per implementare le transizioni tra stati, ma una strategia non contiene un riferimento al contesto in cui viene utilizzato.

  4. L'implementazione di una Strategia può essere passata come parametro all'oggetto che la utilizzerà, ad esempio Collection.sort() accetta un Comparator che è una strategia. D'altra parte, lo stato fa parte del contesto stesso dell'oggetto e nel tempo il contesto dell'oggetto passa da uno stato all'altro.

  5. Sebbene sia la Strategia che lo Stato seguano il principio aperto/chiuso, la Strategia segue anche il Principio di responsabilità unica poiché ciascuna Strategia contiene un algoritmo individuale, le diverse strategie sono indipendenti l'una dall'altra. Cambiare una strategia non richiede cambiare un’altra strategia.

  6. Un'altra differenza teorica tra i modelli Strategy e State è che il creatore definisce la parte "Come" dell'oggetto, ad esempio "Come" l'oggetto di ordinamento ordina i dati, d'altra parte, il modello State definisce "cosa" e "quando" parti dell'oggetto, ad esempio cosa può fare un oggetto quando si trova in un determinato stato.

  7. L’ordine delle transizioni di stato è ben definito nel modello Stato; non esiste tale requisito per il modello Strategia. Il Cliente è libero di scegliere qualsiasi implementazione della Strategia di sua scelta.

  8. Alcuni degli esempi comuni del modello Strategy sono l'incapsulamento di algoritmi, come algoritmi di ordinamento, algoritmi di crittografia o un algoritmo di compressione. Se vedi che il tuo codice deve utilizzare diversi tipi di algoritmi correlati, dovresti prendere in considerazione l'utilizzo del modello Strategy. D'altra parte, riconoscere l'uso del modello State è abbastanza semplice, se è necessario gestire le transizioni di stato e di stato senza molte istruzioni condizionali annidate, il modello State è il modello giusto da utilizzare.

  9. L'ultima ma una delle differenze più importanti tra i modelli State e Strategy è che una modifica alla Strategia viene eseguita dal Client, mentre una modifica allo Stato può essere eseguita dal contesto o dallo stato dell'oggetto stesso.

Riguarda la differenza tra i modelli State e Strategy in Java . Come ho detto, entrambi sembrano simili nelle loro classi e nei diagrammi UML, entrambi forniscono principi di apertura/chiusura e incapsulano il comportamento. Utilizza il pattern Strategy per incapsulare un algoritmo o una strategia esposta al contesto in fase di esecuzione, magari come parametro o oggetto composito, e utilizza il pattern State per controllare le transizioni di stato in Java. Originale qui
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION