Jak połączyć „Command” i „Composite”, aby zasymulować opóźnienie czasowe?

9

Jako ćwiczenie edukacyjne (nie jestem w szkole - po prostu stary facet stara się nauczyć czegoś nowego), próbuję napisać symulację bramki logicznej, która zawiera opóźnienie propagacji. Użytkownik powinien także mieć możliwość grupowania bramek w celu tworzenia obiektów wyższego poziomu.

Chcę zastosować wzorce projektowe do mojego problemu, ale mam trudności.

Czytam wzorce projektowe Head First i widzę, że wzór Command jest dobrym sposobem na symulację impulsów elektrycznych przez obwód z opóźnieniem. Widzę również, że wzór złożony jest dobrym sposobem na symulację zagnieżdżonych jednostek. Po prostu nie wiem, jak je połączyć.

Innymi słowy, gdy przechodzę przez bramę, widzę, że brama „x” powinna odpalić. Ma opóźnienie 15 nanosekund, więc tworzę polecenie ze znacznikiem czasu 15 ns od bieżącego czasu gry. Gdzie jest dyspozytor? W przykładzie restauracji, w której polecenie jest „Rozkazem”, kelnerka i kucharz wysyłają polecenie i mają możliwość wprowadzenia opóźnienia. Jeśli mam bramę „kompozytową”, czy ma ona również własnego dyspozytora? Czy muszę używać Singletona do zarządzania kolejką?

Przeczytałem, co mogłem znaleźć, ale nadal potrzebuję pchnięcia we właściwym kierunku:

Neil Mussett
źródło
9
Wzory są narzędziami. Nikt nie bierze młotka i śrubokręta i myśli, że zbuduję dom. Zamiast tego zacznij budować dom i zdaj sobie sprawę, gdzie młot ułatwiłby pracę.
To nie odpowiada dokładnie na moje pytanie. Mam już zbudowaną dużą aplikację Java, która przekazuje wiadomości od bramki do bramki. Jednak staram się uwzględnić opóźnienie propagacji i okazuje się, że mój projekt aplikacji nie może go łatwo obsłużyć. Miałem nadzieję, że wzorce projektowe mogą pomóc ...
Neil Mussett
4
Szukasz symulacji zdarzeń dyskretnych - jak cron, ale bez „rzeczywistego” czasu. Zbuduj to, a następnie rozpoznaj „och, buduję tutaj kompozyt - wiem, jak to zrobić”, zamiast iść i szukać sposobu, aby wbić kompozyt w rozwiązanie.
1
W szczególności może okazać się przydatna efektywna struktura danych dla zestawu zdarzeń symulacyjnych z komunikatu ACM z sierpnia 1977 r., Tom 20, numer 8 (wyszukiwanie w Google tego tytułu powinno pobrać plik pdf - mam problem z linkowaniem do it) - przechodzi przez koncepcję implementacji struktury danych, która jest znacznie ulepszona w stosunku do listy indeksowanej.
1
Oto link do referatu ACM hostowanego na citeseerx.
Frank

Odpowiedzi:

1

Możesz spojrzeć na przykład z programowania w Scali , ponieważ mają symulator, który robi to, co próbujesz zrobić w Javie:

http://www.cs.helsinki.fi/u/wikla/OTS/Sisalto/examples/html/ch30.html#sec6

Patrząc na ich podejście, możesz dowiedzieć się, jak zmienić program, aby uzyskać pożądane zachowanie.

Wspomniałeś, że nie możesz go łatwo dodać, więc dlaczego nie wyjaśnić, jakie jest twoje podejście i jaka jest trudność, na którą napotykasz, aby ludzie mogli dać ci sugestie, których mogłeś nie wziąć pod uwagę.

Jak wspomniano, wzorce projektowe są sposobem na mówienie o tym, co robi twój kod, jako skrót, ale pomysł próby wymuszenia wzorców projektowych wydaje się po prostu złym pomysłem.

Zasadniczo opóźnienie propagacji nie powinno być trudne.

Możesz mieć klasę podstawową, która jest Gatew niej opóźniona.

Wszystkie bramki wychodzą z tego i ustawiają rzeczywiste opóźnienie.

Teraz, gdy podążasz za sygnałem, gdy znajdujesz się w bramie, wątek może spać dla symulowanego opóźnienia, ale oznacza to również, że musisz mapować czas rzeczywisty do symulowanego czasu, ponieważ symulator będzie wolniejszy niż prawdziwy system byłoby.

Jeśli okaże się, że masz zbyt wiele wątków, po prostu umieść na posortowanej liście, obok następnego na górze, a gdy zatrzymasz się, po prostu ustaw czas opóźnienia i na każdej pętli symulator wybierze te, które są teraz gotowe , wykonaj następną akcję, a następnie nastąpi następne opóźnienie.

Byłoby to podobne do pętli gry.

James Black
źródło
0

Innymi słowy, gdy przechodzę przez bramę, widzę, że brama „x” powinna odpalić.

Zatem nie używasz wzorca poleceń.

Jeśli mam bramę „kompozytową”, czy ma ona również własnego dyspozytora?

Dobry Boże, nie. Cały punkt złożonego wzoru polega na tym, że można dostarczyć obiekt złożony do lokalizacji, która oczekuje tylko jednego obiektu. Pozwala to na rozsądne komponowanie zachowań.

Czy muszę używać Singletona do zarządzania kolejką?

Piekło nie Czy masz tylko jednego kucharza i jedną kelnerkę na całym świecie? Czy mają tylko jedną kuchnię?

Mieszanie polecenia i wzorca złożonego jest dość proste. Masz interfejs reprezentujący polecenie. Każde konkretne polecenie może zastąpić (lub w inny sposób spełnić je w językach innych niż dziedziczenie) ten interfejs, aby zapewnić pewne zachowanie. Twoje opóźnienie jest jednym z takich prostych zachowań.

Wzór złożony zapewnia dwa (lub więcej) obiekty / zachowania za jednym interfejsem. Najprostszym zastosowaniem w tym przykładzie byłoby polecenie złożone, które pobiera dwa inne polecenia, a następnie, gdy zostanie wyświetlone polecenie wykonania, wyzwala dwa zapisane polecenia. W ten sposób możesz wziąć izolowane polecenie „opóźnienie” i dowolne inne polecenie, aby utworzyć polecenie opóźnione.

Telastyn
źródło