State vs Strategy, kiedy stosować, który?

0

Witam,

Potrzebuję pomocy w ogarnięciu wzorców State i Strategy. Problem polega na tym, że nie mogę znaleźć wielkich różnic pomiędzy tymi wzorcami. Stosowałem w swoich programach wzorzec State i okazywało się że taki sam efekt można osiągnąć implementując Strategy i na odwrót.

Te różnice w implementacji widzę, w strategy klasa (context ) posiada referencję do różnych strategii. A w state jest na odwrót prawda? To Klasa reprezentująca stan posiada referencję do obiektu (context).

Mógł bym prosić o jakiś prosty, życiowy przykład kiedy stosować, który wzorzec? Nie mogę poczuć tej idei...

0

No tak czytałem... różnice w regułce to ja znam. Chodziło mi bardziej o jakieś przykłady, ale dzięki za chęci.

1

Nie ma sensu, żebym Ci tłumaczył ich zastosowanie, bo powiedziałbym pewnie to samo, co w linku wyżej. ;)
Przede wszystkim zrozum idee obu wzorców, następnie zaimplementuj i pobaw się trochę ich działaniem. Zrozumienie przyjdzie z czasem.

1

Strategies only handle a single, specific task, while States provide the underlying implementation for everything (or most everything) the context object does.

Masz napisane jak byk wszelkie różnice:

  • Strategia skupia się na jednym, konkretnym zadaniu, jakimś algorytmie.
  • Stan z kolei może robić prawie wszystko. Tworzysz maszynę stanów i każdy stan jest odpowiedzialny za swoją robotę oraz decyduje kiedy przejść w inny stan. Przykładem może być tutaj automat do sprzedaży piłeczek: masz kilka stanów, w których znajduje się maszyna:
    a) brak piłeczek
    b) gotowy do sprzedaży
    c) decyzja kupującego - kupić lub może jeszcze zrezygnować z zakupu i zostaną zwrócone pieniądze

Zaś contextem jest tutaj nasz automat do piłeczek, rzecz jasna. Zaletą State jest elastyczność - w każdej chwili możemy dodać nowy stan/funkcjonalność, nie ingerując w działanie pozostałych stanów - jedynie musimy zdefiniować przejście z któregoś ze stanów do tego nowego. W zasadzie to stany nie powinny nic o sobie wiedzieć.

0

Od strony implementacji to często wygląda tak samo prawda a przynajmniej na diagramach UML. Ogólnie wzorzec strategii w implementacji można poznać po tym że zmienia tylko konkretne zadanie obiektu a stan po tym, że zmienia zachowanie całego obiektu tak? Dobrze myślę?

Np. mając konto bankowe i mamy różne stany tego konta (konto otwarte, konto zamknięte) i np. jeśli konto jest zamknięte to zmienia się zachowanie całego obiektu... nie można wpłacać na konto, wypłacać pieniędzy itp. Taka sytuacja podchodzi typowo pod wzorzec stanu prawda?

1
dejmien napisał(a):

Np. mając konto bankowe i mamy różne stany tego konta (konto otwarte, konto zamknięte) i np. jeśli konto jest zamknięte to zmienia się zachowanie całego obiektu... nie można wpłacać na konto, wypłacać pieniędzy itp. Taka sytuacja podchodzi typowo pod wzorzec stanu prawda?

Dobrze kombinujesz. Strategią np. w tym przykładzie byłby sposób wypłacania gotówki - powiedzmy, że do 1000 zł nie trzeba klikać dodatkowego potwierdzenia, natomiast do wypłacenia kwoty większej niż 1000 zł musisz wykonać jakąś dodatkową czynność. Chodzi o to, że przy strategii zmienia się sam wewnętrzny algorytm/sposób działania.

Inny przykład to podajesz liczby, jakiekolwiek - całkowite, wymierne, niewymierne, małe, duże, itp. a program sam dobiera odpowiednią strategię sortowania czy wyszukiwania konkretnej liczby w zależności od ich ilości/wartości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1