2010-01-27 15 views
5

Projektuję grę pinball dla projektu Uni, w którym mają być 2 tryby: tryb pracy i tryb konstruktora, w którym można zaprojektować/przeprojektować układ maszyny.Aby użyć lub nie użyć wzorca stanu?

Moja początkowa myśl dotyczyła schematu państwa - obawiam się jednak, że wspólny interfejs między państwami może doprowadzić je do wdrożenia metod, które nie są odpowiednie dla tego stanu.

Np. W trybie budowniczym byłoby całkowicie właściwe ustawienie pozycji zderzaka lub czegoś podobnego; ale w trybie roboczym byłby realizowany jako nie robiący nic lub wyrzucający wyjątek - co wydaje się nieprzyjemne, zwłaszcza jeśli istnieje wiele takich metod.

Czy istnieje lepszy projekt?

+2

Czy wymagane jest użycie wzoru? Dwa państwa tego nie uzasadniają. – ChaosPandion

+0

Wcale nie, ale wysoce rozłączony dostaje więcej ocen – Robert

+0

Myślałem o 3 stanach, ponieważ może być fajnie, nie przełączać się do trybu budowniczego, podczas gdy gra jest uruchomiona ... – Robert

Odpowiedz

11

Twoja intuicja jest poprawna. Wzorzec stanu jest pomocny, gdy program może mieć wiele różnych stanów, z których każdy obsługuje wiele takich samych operacji. Na przykład program do rysowania może mieć wiele różnych narzędzi, ale każdy z nich obsługuje podobne operacje, takie jak odkładanie pióra w górę lub w górę i rysowanie linii między 2 punktami.

W twoim przypadku są tylko 2 stany, i nie mają one wiele wspólnego zachowania. Najważniejsze są wspólne operacje GUI, które prawdopodobnie znajdują się już w standardowej bibliotece. Musisz upewnić się, że kod rzeczy, takich jak wyświetlanie zderzaków, nie jest duplikowany, ale możesz to zrobić bez wzorca stanu.

1

Kilka lat temu miałem podobne zadanie na uniwersytecie.

Powiedziałbym, że użycie wzoru stanu jest przesadą dla tego, jak również nie jest całkowicie dostosowane, jak wcześniej wspomniano. Co zrobiliśmy z tego zadania to:

  • użyć czegoś powyżej różne tryby, które pozwala na przełączanie się między nimi.
  • W każdym trybie nie ma wiedzy o innym trybie, nie nawiązywane są połączenia między sobą.
  • Dzieli się wiedzą na temat modelu (w twoim przypadku będzie to deska do gry w pinball, z pozycjami zderzaków, piłek itp.), Więc po przełączeniu między nimi są one spójne.
  • Pod względem GUI, każdy tryb jest w zasadzie podany do zrobienia tego. Tak jak mówisz, każdy tryb ma różne możliwe działania, więc zmuszanie ich do dzielenia tych samych działań w ramach wzorca stanu jest "śmierdzące".

Zasadniczo, jak wspomniano w innym miejscu, oba tryby nie mają wystarczającego podobieństwa, aby rzeczywiście uzasadnić wzór stanu tutaj.

Istnieje jedna możliwość zastosowania wzoru stanu, który miałby sens. Ponieważ jest to zadanie uniwersyteckie, prawdopodobnie będzie to zasługa myśli i uzasadnienia. Jest to związane z "poziomem wyżej", o którym wspomniałem wcześniej. Z mojego doświadczenia wynika, że ​​była to część GUI, która była niezależna od trybu. Pozwoliło to na takie rzeczy jak zamknięcie aplikacji, otwarcie poprzednich konfiguracji pinballa i przełączanie między trybami. Mogłoby to również pokazać elementy menu zależne od kontekstu. Stan menu można pobrać z bieżącego trybu. Tak więc tryb budowniczego może zawierać działania składowania i inne działania budowniczego, a tryb uruchamiania może oferować opcje odtwarzania/wstrzymywania. Jeśli poświęciłeś czas na badanie schematu państwowego i życzysz sobie, aby to się opłacało, byłoby to możliwe.

P.S.Murray wydawał się entuzjastycznie nastawiony do korzystania z wzorców projektowych w tamtym czasie ;-)

+0

czy możesz wyjaśnić, co masz na myśli przez "poziom wyżej"? – Robert

+0

Myślałem w kategoriach obiektu zawierającego odniesienie do obu różnych trybów i pozwalając na możliwość przełączania się między nimi. Tryby nie powinny wiedzieć, jak przełączać się między sobą, to jest odpowiedzialność za coś "ponad" nimi. Jako konkretny przykład, jeśli każdy tryb był zawarty w JPanelu, "poziom wyżej" byłby ramą JFrame, która zawierałaby odniesienia do obu z nich, i miałaby kontrolę (jak element menu), aby przełączać się między nimi. Czy to ma trochę więcej sensu? – Grundlefleck

+0

BTW: "level above" nie jest właściwym terminem technicznym (jak można się domyślić), więc nie jest tak naprawdę Googleable. "Obiekt, który składa oba obiekty trybu" jest prawdopodobnie bliższy prawidłowym terminom. – Grundlefleck

Powiązane problemy