Skip to content

Witaj w Świecie Jutra!

  • Technologie jutra
  • Sprzęt jutra
  • Aplikacje jutra
  • Programowanie
  • Księga Drogi
  • Renowacja
  • Różności
  • Archiwum
  • Autor
  • Home
  • Wszystko
  • Wzorce projektowe – State
  • Programowanie
  • Wszystko

Wzorce projektowe – State

Jakub Raczkowski 29 stycznia 2024

Kazachstan to też rodzaj stanu (źródło: film Borat)

Lata 80-te ubiegłego wieku, Związek Radziecki. Na komisji poborowej, przed doświadczonym sierżantem stoi osiemnastoletni poborowy. Sierżant uśmiecha się szeroko i mówi: „No młody! Mam dzisiaj dobry humor, więc sam zdecydujesz gdzie będziesz służyć!”. Rekrut rozpromienia się i mówi nieśmiało: „Zawsze chciałem zobaczyć Stany…”. Na co sierżant: „Mówisz – masz! Piszemy: A-F-G-A-N-I-S-T-A-N”.

Teraz popita i jeśli suchar przeszedł to lecimy z tematem.

„Stan” o którym będziemy dzisiaj rozmawiać należy do rodziny wzorców strategio-podobnych, dlatego zaczniemy od przypomnienia sobie pozostałych i porównamy je z bohaterem tego tekstu. Opisy są skrótowe i skupiają się na najważniejszych różnicach.

  • Strategia – pozwala wybrać JEDEN Z WIELU algorytmów do uzyskania potrzebnych danych
  • Fabryka – pozwala wybrać JEDEN Z WIELU algorytmów do utworzenia zestawu konkretnych obiektów
  • Metoda szablonowa – pozwala stworzyć kilka algorytmów w oparciu o wspólny szablon, następnie korzystamy z JEDNEGO, dobranego do sytuacji
  • Polecenie – pozwala wybrać TYLE ILE CHCEMY algorytmów do dowolnego celu
  • Stan – jak powyżej, ale my tylko wybieramy początkowy algorytm, który zmienia się na kolejny wedle wcześniej ustalonych zasad

Dokładna definicja brzmi tak:

Stan – umożliwia obiektowi zmienianie zachowania wraz ze zmianą jego wewnętrznego stanu. Uzyskujemy w ten sposób złudzenie zmiany klasy tego obiektu.

Rusz Głową! Wzorce projektowe

O ile taką Strategię wybieramy sami, o tyle decydując się na wzorzec Stan idziemy w automatykę. Stany muszą być co najmniej dwa: np. włączony i wyłączony, a każdy powinien mieć metodę pozwalającą na przejście do tego drugiego.

Latarki są różne, ale nam wystarczy taka z jednym przyciskiem.

Jeśli weźmiemy za przykład latarkę to ma ona dwa stany – albo jest zaświecona, albo zgaszona. Przycisk jest interfejsem, który zmienia stan latarki – z zaświeconego na zgaszony i z powrotem.

TEN SAM PRZYCISK ROBI DWIE RÓŻNE RZECZY w zależności od stanu w jakim znajduje się latarka.

Stanów może być oczywiście więcej, mogą się rozgałęziać, iść w dziesiątki, albo wracać do początku. Tylko pamiętajmy, że każdy stan jest reprezentowany przez osobną klasę dlatego nie ma co przesadzać – chyba, że chcemy sobie urządzić śmietnik z naszego projektu.

Ale po kolei…

Przeglądam właśnie swoją Steamową bibliotekę i zastanawiam się który końcowy boss wywarł na mnie największe wrażenie.

Końcówka Mass Efect (1) była w iście filmowym stylu i wciąż od czasu do czasu puszczam sobie soundtrack jej towarzyszący. Ale boss nie był jakoś szczególnie wymagający.

Divine Divinity Original Sin oferowało miodną rozgrywkę i pamiętam z niej przepiękne lokacje, ale nie ostatecznego złodupca. Najwidoczniej nie był wart zapamiętania…

Mam! FTL: Faster Than Light! Grę opisałem w osobnym artykule, jeśli ktoś nie grał to gorąco zachęcam! Latamy sobie stateczkiem po kosmosie (turowo), a od czasu do czasu toczymy bitwy z innymi załogami. Jedna rozgrywka trwa do dwóch godzin i jeśli uda nam się dotrwać do końca to przychodzi czas na walkę z ostatecznym bossem – ogromnym statkiem rebeliantów.

FTL – walka to esencja tej gry

Bitwa jest szczególnie wymagająca, a to przez ten detal, że w odróżnieniu od poprzednich wrogów, końcowy boss ma trzy stadia ataku do których musimy się dostosować. Na początku wróg próbuje hakować nasze systemy ofensywne i defensywne, wyłącza osłony i atakuje bronią konwencjonalną.

Kiedy uda nam się uszczuplić jego pasek zdrowia, następuje Zmiana Stanu – teraz krążownik zaczyna wysyłać ku nam autonomiczne drony. Jeśli nie mamy dobrze zorganizowanej obrony to szybko potną nas na kawałki.

Gdy wrogiemu okrętowi zostanie mniej niż 30% wytrzymałości znów przechodzi w inny stan – tym razem teleportuje do nas roboty, których celem jest eliminacja naszych załogantów – próbuje zniszczyć gracza od środka.

Aby zobaczyć ten widok trzeba się nieźle napocić!

Jak widać, zmiana stanów jest uzależniona od punktów życia – przy każdych nowych obrażeniach następuje sprawdzenie czy już należy zmienić stan.

Przygotowałem coś podobnego (pełny kod tutaj) ale jak dotychczas – w klimatach fantasy. Zacznijmy od analizy walki wojownika z bossem:

Przy okazji nauczyłem się kolorować linijki w konsoli 🙂

Boss ma trzy stany/fazy, a każdy z nich jest osobną klasą implementującą interfejs Phase. Ten zaś posiada tylko jedną metodę: retaliate() która jest odpowiedzią na atak wojownika i która w każdej fazie bossa działa nieco inaczej.

Faza 1

W fazie pierwszej obrażenia są mierne, a boss nie korzysta z żadnych umiejętności specjalnych. Kiedy punkty życia (bossa) spadną poniżej 150 następuje zmiana stanu w klasie bossa – od teraz będą wykorzystywane metody fazy drugiej.

if (user.getHp() < 150){
                user.setPhase(new PhaseTwo());
            }
Faza 2
Faza 3

Ostateczny etap to potężny atak skillowy. Ten stan już nie prowadzi nigdzie dalej. Skończy się sam jeśli tylko warunek (hp <= 0) w klasie bossa zostanie spełniony.

Fajne jest to, że stany zmieniają się automatycznie, dzięki czemu cała, długa potyczka wywoływana jest jedną komendą:

warrior.attack(bigBoss);

ITCandidateEvaluator

Podsumowując.

Wszystkie „strategiczne” wzorce wydają się dobrze przemyślane i przydatne, ale jeśli miałbym wybrać tylko jeden z nich to zdecydowałbym się na Metodę Szablonową (z Fabryką na miejscu drugim). Jest to najbardziej uniwersalne rozwiązanie, które sprawdzi się w chyba każdym projekcie, a do tego (w porównaniu z bazową Strategią) ogranicza duplikację kodu.

Jeśli chciałbym użyć „Polecenia” to musiałbym je wciskać trochę na siłę, specjalnie zmieniając strukturę klasową tylko pod to podejście. A to chyba powinno działać na odwrót, prawda?

Natomiast co do Stanu – o ile bardzo mi się spodobał, to na tę chwilę po prostu nie widzę możliwości aby go użyć, tak by mi w czymś pomagał. Obiekt kandydata cały czas będzie miał stan „niezatrudniony”, a jego zmiana może nastąpić tylko poza ramami programu.

To byłoby na tyle. Dziękuję za uwagę – w następnym wpisie zajmiemy się wzorcem „Proxy„.

Tags: design patterns programming

Continue Reading

Previous: Wzorce projektowe – Composite
Next: Wzorce projektowe – Proxy

Related Stories

Mageege Moon104 – test niskoprofilowego mechanika
  • Sprzęt

Mageege Moon104 – test niskoprofilowego mechanika

11 marca 2025
Przebranżowienie cz.4
  • Programowanie

Przebranżowienie cz.4

27 lutego 2025
Smartfon Jutra
  • Sprzęt

Smartfon Jutra

15 lutego 2025

Ze świata

  • Antyweb
  • Kwantowo
  • Dwóch po dwóch
Nowy iPhone rozładowywał się przez noc. Skuteczna okazała się tylko jedna procedura
To jeden z największych problemów na polu walki. Firma z USA wie, jak go rozwiązać
Zostawiasz ładowarkę w gniazdku? Sprawdź, ile prądu naprawdę zużywa
Nie działa Ci ChatGPT? W usługę trafiła poważna awaria
Xbox szuka sposobu na odbicie się od dna. Lekarstwem ma być ostatnia decyzja
Google Pixel 11a już bez tajemnic. Kilka kluczowych zmian
Garmin wydłuża czas pracy zegarków. Tę aktualizację warto pobrać
LEGO przygotowało prawdziwą ucztę dla kolekcjonerów. Ten zestaw zachwyca od pierwszego spojrzenia
Sony wyciska użytkowników PlayStation od lat. Dziw, że dopiero teraz zauważyliście
YouTube rozczarowuje użytkowników. Wszystkiemu winien nowy błąd
Śpisz z telefonem przy poduszce? Lepiej odłóż go w inne miejsce
Stworzył fizyczne wydania gier na Steama. Są dostępne na "kartridżach"
Złoto na strychu? Te stare telefony mogą być dziś warte fortunę
Thule EnRoute 12L – recenzja. Wypełnia lukę między nerką, a plecakiem podróżnym
HP blokuje nawet oryginalne tusze? Kontrowersje wokół aktualizacji drukarek narastają
"Polski ChatGPT" goni najlepszych. Jest świetny, ale ja nie kupuję w nim jednej rzeczy
Chcesz jeść mniej? Lepiej tak nie rób. Naukowcy obalili popularny mit
Spotify nadrabia zaległości. Potrzebna opcja trafi do aplikacji
Ta platforma VOD kpi sobie z Polaków. Nie tak to miało wyglądać
Garmin CIRQA na pierwszym zdjęciu. Premiera tuż za rogiem
SpudCell – syntetyczna komórka, która udaje życie
Mega upał, omega manipulacja
Coraz więcej dowodów, coraz mniej pewności
Matematyczno-restauracyjny dylemat Ryszarda
Silnik produkujący informacje zamiast spalin
Orzeczenie w sprawie En Arche v. Adam Adamczyk
To by było na tyle, jeśli chodzi o możliwość ugody z kreacjonistami
Ocalić od zapomnienia
Ostatni kwant
ALH 84001 – meteoryt, o którym mówiono nawet w Białym Domu
Tańszy Game Pass, droższy Steam Deck i Internet 0202122 – Odcinek #135
Elite Dangerous. Gra, z której odchodzi się po cichu
Gry zasługujące na adaptację filmową – Odcinek #134
Relacja z RePlay Fest 2026
Najlepsze intra i openingi w grach – Odcinek #133
AI, Star Trek, Rycerz Siedmiu Królestw, Festiwal dem na Steam Next Fest – Odcinek #132
Gry, filmy i seriale w 2025 i 2026 roku – Odcinek #131
30 lat konsoli PlayStation – Odcinek #130
Omawiamy serię The Walking Dead (gość: Stary Gracz)
Nikt nie potrzebuje cienkich smartfonów – Odcinek #129

To może cię zainteresować:

Mageege Moon104 – test niskoprofilowego mechanika
  • Sprzęt

Mageege Moon104 – test niskoprofilowego mechanika

11 marca 2025
Przebranżowienie cz.4
  • Programowanie

Przebranżowienie cz.4

27 lutego 2025
Smartfon Jutra
  • Sprzęt

Smartfon Jutra

15 lutego 2025
Czym jest Swagger?
  • Programowanie

Czym jest Swagger?

22 lipca 2024
  • Technologie jutra
  • Sprzęt jutra
  • Aplikacje jutra
  • Programowanie
  • Księga Drogi
  • Renowacja
  • Różności
  • Archiwum
  • Autor
Copyright © All rights reserved. | DarkNews by AF themes.