JavaRush /Blog Java /Random-PL /Różnica między wzorcami stanu i strategii w Javie
0xFF
Poziom 9
Донецк

Różnica między wzorcami stanu i strategii w Javie

Opublikowano w grupie Random-PL
Aby właściwie używać wzorców stanu i strategii w podstawowych aplikacjach Java, ważne jest, aby programiści Java dobrze zrozumieli różnicę między nimi. Chociaż oba wzorce, Stan i Strategia, mają podobną strukturę i oba opierają się na zasadzie otwartej/zamkniętej, reprezentującej „O” w zasadach SOLID , ich przeznaczenie jest zupełnie inne . Różnica między wzorcami stanu i strategii w Javie - 1Wzorzec strategii w Javie służy do hermetyzacji powiązanych zestawów algorytmów, aby zapewnić klientowi elastyczność wykonywania. Klient może wybrać dowolny algorytm w czasie wykonywania bez zmiany kontekstu klasy korzystającej z Strategy. Niektóre popularne przykłady wzorca strategii to pisanie kodu korzystającego z algorytmów, takich jak szyfrowanie, kompresja lub sortowanie. Z drugiej strony wzorzec State pozwala obiektowi zachowywać się inaczej w różnych stanach. Ponieważ w prawdziwym świecie przedmiot często ma stany i zachowuje się inaczej w różnych stanach, np. automat sprzedaje towary tylko wtedy, gdy jest w stanie hasCoin, nie sprzedaje, dopóki nie wrzucisz do niego monety. Teraz wyraźnie widać różnicę pomiędzy wzorcami Strategii i Stanu, są to różne intencje. Wzorzec Stan pomaga obiektowi zarządzać stanem, natomiast wzorzec Strategia pozwala klientowi wybrać inne zachowanie. Kolejną różnicą, która nie jest tak łatwa do zauważenia, jest to, kto stoi za zmianą zachowania. W przypadku wzorca Strategia jest to klient dostarczający kontekstowi różne strategie, we wzorcu Stan przejście kontrolowane jest przez kontekst lub stan samego obiektu. Dodatkowo, jeśli samodzielnie zarządzasz zmianami stanu w obiekcie State, musi tam znajdować się odwołanie do kontekstu, np. automat musi mieć możliwość wywołania metody setState()zmiany aktualnego stanu kontekstu. Natomiast obiekt Strategii nigdy nie zawiera odniesienia do kontekstu, klient sam przekazuje do kontekstu wybraną przez siebie Strategię. Różnica między wzorcami stanu i strategii jest jednym z popularnych pytań na rozmowach kwalifikacyjnych na temat wzorców Java . W tym artykule na temat wzorców Java przyjrzymy się temu bliżej. Przeanalizujemy pewne podobieństwa i różnice pomiędzy wzorcami strategii i stanu w Javie, co pomoże ci lepiej zrozumieć te wzorce.

Podobieństwa pomiędzy wzorcami Państwa i Strategii

Jeśli spojrzysz na diagram UML wzorców Stan i Strategia, zauważysz, że oba wyglądają do siebie podobnie. Obiekt, który używa stanu do zmiany swojego zachowania, nazywany jest Contextobiektem, podobnie obiekt, który używa strategii do zmiany swojego zachowania, nazywany jest Contextobiektem. Pamiętaj, że klient wchodzi w interakcję z Contextobiektem. W przypadku wzorca State kontekst deleguje wywołania do obiektu State, który jest utrzymywany jako obiekt bieżący, a w przypadku wzorca Strategy kontekst wykorzystuje obiekt Strategy jako parametr lub jest podawany podczas tworzenia kontekst obiektu. Diagram UML wzorca State w Javie Różnica między wzorcami stanu i strategii w Javie - 2 Ten diagram UML wzorca State przedstawia klasyczny problem tworzenia zorientowanego obiektowo projektu automatu sprzedającego w Javie. Jak widać, stan automatu jest reprezentowany za pomocą interfejsu, który następnie posiada implementację reprezentującą konkretny stan. Każdy stan posiada także odniesienia do kontekstu obiektu, umożliwiające przejście do innego stanu w wyniku akcji wywołanej w kontekście. Diagram UML wzorca Strategii w Javie Różnica między wzorcami stanu i strategii w Javie - 3 Ten diagram UML wzorca Strategii zawiera pewnego rodzaju funkcjonalne implementacje. Ponieważ istnieje wiele algorytmów sortowania, ten wzorzec projektowy pozwala klientowi wybrać algorytm podczas sortowania obiektów. W rzeczywistości środowisko Java Collection wykorzystuje ten wzorzec do implementacji metody Collections.sort()używanej do sortowania obiektów w Javie. Jedyna różnica polega na tym, że zamiast pozwalać klientowi na wybór algorytmu sortowania, pozwala mu określić strategię porównania, przekazując instancję interfejsu Comparator lub Comparable do języka Java . Przyjrzyjmy się kilku podobieństwom między tymi dwoma głównymi wzorcami projektowymi w Javie:
  1. Obydwa wzorce, State i Strategy, ułatwiają dodawanie nowego stanu i strategii bez wpływu na kontekst obiektu, który ich używa.

  2. Obydwa utrzymują kod zgodnie z zasadą otwarty/zamknięty , co oznacza, że ​​projekt będzie otwarty na rozszerzenia, ale zamknięty na modyfikacje. W przypadku wzorców Stan i Strategia kontekst obiektu jest zamknięty na modyfikacje, wprowadzanie nowych Stanów lub nowych Strategii lub nie ma potrzeby modyfikowania kontekstu innego stanu lub minimalnych zmian.

  3. Tak jak kontekst obiektu zaczyna się od stanu inicjalizacji obiektu we wzorcu State, tak kontekst obiektu ma także domyślną strategię w przypadku wzorca Strategy w Javie.

  4. Wzorzec Stan reprezentuje różne zachowania w postaci różnych stanów obiektów, natomiast wzorzec Strategii reprezentuje różne zachowania w postaci różnych strategii obiektów.

  5. Obydwa wzorce, Strategia i Stan, zależą od podklas realizacji zachowań. Każda konkretna strategia stanowi rozwinięcie Strategii Abstrakcyjnej; każdy stan jest podklasą interfejsu lub klasy abstrakcyjnej używanej do reprezentowania Państwa.

Różnice między wzorcami strategii i stanu w Javie

Teraz wiemy, że wzorce Państwa i Strategii mają podobną strukturę, ale ich cel jest inny. Przyjrzyjmy się kilku kluczowym różnicom między tymi wzorcami projektowymi.
  1. Wzorzec Strategii zawiera zestaw powiązanych algorytmów i umożliwia klientowi używanie wymiennych zachowań pomimo kompozycji i delegowania w czasie wykonywania, z drugiej strony wzorzec Stan pomaga klasie wykazywać różne zachowania w różnych stanach.

  2. Następna różnica między wzorcami stanu i strategii polega na tym, że stan zawiera stan obiektu, podczas gdy wzorzec strategii zawiera algorytm lub strategię. Ponieważ stan jest powiązany z obiektem, nie można go ponownie wykorzystać, ale oddzielając strategię lub algorytm od kontekstu, możemy go ponownie wykorzystać.

  3. We wzorcu Stan stan osobisty może zawierać odniesienie do kontekstu w celu realizacji przejść między stanami, ale Strategia nie zawiera odniesienia do kontekstu, w którym jest używana.

  4. Implementację strategii można przekazać jako parametr do obiektu, który będzie z niej korzystał, na przykład Collection.sort() przyjmuje komparator , który jest strategią. Z drugiej strony stan jest częścią samego kontekstu obiektu i z biegiem czasu kontekst obiektu przechodzi z jednego stanu do drugiego.

  5. Chociaż zarówno Strategia, jak i Państwo kierują się zasadą otwartego/zamkniętego, Strategia kieruje się również zasadą pojedynczej odpowiedzialności, ponieważ każda strategia zawiera indywidualny algorytm, różne strategie są od siebie niezależne. Zmiana jednej strategii nie wymaga zmiany innej strategii.

  6. Kolejna teoretyczna różnica pomiędzy wzorcami Strategii i Stanu polega na tym, że twórca definiuje część obiektu „Jak”, np. obiekt sortowania „Jak” sortuje dane, z drugiej strony wzorzec Stanu definiuje części „co” i „kiedy” obiektu, np. co obiekt może zrobić, gdy znajduje się w określonym stanie.

  7. Kolejność przejść stanów jest dobrze zdefiniowana we wzorcu Stanu, nie ma takiego wymogu w przypadku wzorca Strategii. Klient ma swobodę wyboru dowolnej realizacji wybranej przez siebie Strategii.

  8. Niektóre z typowych przykładów wzorca strategii to enkapsulacja algorytmów, takich jak algorytmy sortowania, algorytmy szyfrowania lub algorytm kompresji. Jeśli widzisz, że Twój kod musi wykorzystywać różne rodzaje powiązanych algorytmów, powinieneś rozważyć użycie wzorca Strategy. Z drugiej strony rozpoznanie użycia wzorca State jest dość łatwe, jeśli chcesz kontrolować stan i przejścia między stanami bez dużej liczby zagnieżdżonych instrukcji warunkowych, właściwym wzorcem będzie wzorzec State.

  9. Ostatnią z najważniejszych różnic pomiędzy wzorcami Stanu i Strategii jest to, że zmiany na Strategię dokonuje Klient, natomiast zmiany na Stan może dokonać kontekst lub sam stan obiektu.

Wszystko to dotyczy różnicy pomiędzy wzorcami stanu i strategii w Javie . Jak powiedziałem, oba wyglądają podobnie w swoich klasach i diagramach UML, oba zapewniają otwarte/zamknięte zasady i hermetyzują zachowanie. Użyj wzorca Strategy, aby enkapsulować algorytm lub strategię udostępnianą kontekstowi w czasie wykonywania, na przykład jako parametr lub obiekt złożony, i użyj wzorca State do kontrolowania przejść stanów w Javie. Oryginał tutaj
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION