Як би я поєднав "Command" та "Composite", щоб імітувати затримку часу?


9

Як навчальна вправа (я не в школі - просто старий хлопець, який намагається навчитися чомусь новому), я намагаюся написати логічне моделювання воріт, яке включає затримку поширення. Користувач також повинен мати можливість групувати ворота разом для створення об'єктів вищого рівня.

Я хочу застосувати шаблони дизайну до своєї проблеми, але мені важко.

Я читаю шаблони дизайну Head First , і бачу, що шаблон Command - це хороший спосіб імітувати електричні імпульси через ланцюг із затримкою. Я також бачу, що композитний візерунок є хорошим способом імітувати вкладені одиниці. Я просто не знаю, як їх змішати.

Іншими словами, перебираючи свої ворота, я бачу, що ворота "х" повинні стріляти. Він має затримку 15 наносекунд, тому я створюю команду з позначкою часу 15 нс від поточного часу гри. Де диспетчер? У прикладі закусочної, командою є «Замовлення», офіціантка та кухар відправляють команду та мають можливість ввести затримку. Якщо у мене є "складені" ворота, чи має він також власного диспетчера? Чи потрібно використовувати Singleton для керування чергою?

Я читав, що міг знайти, але мені все одно потрібний поштовх у правильному напрямку:


9
Візерунки - це інструменти. Ніхто не бере молотка та шуруповерта і думає, що будую будинок. Натомість починайте будувати будинок і зрозумійте, де молоток полегшить роботу.

Це не відповідає точно на моє запитання. У мене вже створено великий додаток Java, який передає повідомлення від воріт до воріт. Однак я намагаюся включити затримку розповсюдження, і я вважаю, що дизайн моєї програми не може з цим легко впоратися. Я сподівався, що шаблони дизайну можуть допомогти ...
Ніл Мюссет

4
Ви шукаєте дискретного моделювання подій - на крон, але без "реального" часу. Побудуйте це, а потім визнайте "о, я будую композит тут - я знаю, як це зробити", а не йдучи і шукаю якийсь спосіб врізати композит у рішення.

1
Зокрема, ви можете виявити ефективну структуру даних для набору моделей подій із повідомлень ACM серпня 1977 р., Том 20, номер 8 досить корисним (пошук у Google за цим заголовком повинен підтягнути pdf - у мене виникають проблеми з підключенням до це) - це проходить через концепцію реалізації структури даних, яка значно покращується за допомогою індексованого списку.

1
Ось посилання на документ ACM, розміщений на сайті citeseerx.
Френк

Відповіді:


1

Ви можете подивитися приклад програми «Програмування в Scala» , оскільки у них є тренажер, який робить те, що ви намагаєтеся зробити на Java:

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

Переглядаючи їх підхід, ви можете дізнатися, як змінити свою програму, щоб отримати потрібну вам поведінку.

Ви згадали, що не можете його легко додати, то чому б не пояснити, у чому полягає ваш підхід, і у чому полягає складність, з якою ви стикаєтесь, щоб люди могли дати вам кілька пропозицій, які ви, можливо, не розглядали.

Як уже згадувалося, шаблони дизайну - це способи говорити про те, що робиться вашим кодом, як скорочення, але ідея спробувати змусити дизайнерські шаблони просто здається поганою ідеєю.

В основному затримка розповсюдження не повинна бути важкою.

Ви можете мати базовий клас, який є Gate, і в неї ставити затримку.

Усі ворота простягаються від цього і встановлюють фактичну затримку.

Тепер, коли ви стежите за сигналом, перебуваючи у воротах, ця нитка може спати за імітовану затримку, але це також означає, що вам потрібно зіставити в режимі реального часу ваш імітований час, оскільки ваш тренажер буде повільніше, ніж реальна система було б.

Якщо ви виявите, що у вас занадто багато ниток, то просто помістіть їх у відсортований список, наступним зверху, і коли ви призупинитесь, просто поставте час, коли буде зроблено затримку, і на кожен цикл тренажер підбере ті, які зараз готові , зробіть наступну дію, і тоді відбудеться наступна затримка.

Це було б схоже на ігровий цикл.


0

Іншими словами, перебираючи свої ворота, я бачу, що ворота "х" повинні стріляти.

Тоді ви не використовуєте шаблон команди.

Якщо у мене є "складені" ворота, чи має він також власного диспетчера?

Шановний боже ні. Вся суть складеного шаблону полягає в тому, що ви можете надати складений об’єкт до місця, яке очікує лише одного об’єкта. Це дозволяє складати поведінку розумним чином.

Чи потрібно використовувати Singleton для керування чергою?

Чорт візьми, ні. У вас всього один кухар і одна офіціантка у всьому світі? У них лише одна кухня?

Змішування командного та складеного шаблону досить прямо. У вас є інтерфейс, який представляє команду. Кожна конкретна команда може змінити (або іншим чином задовольнити її в мовах без успадкування) цей інтерфейс, щоб забезпечити певну поведінку. Ваша затримка - одна така проста поведінка.

Композитний малюнок забезпечує два (або більше) об'єктів / поведінки за одним інтерфейсом. Найпростішим використанням цього прикладу буде складена команда, яка приймає дві інші команди, а потім, коли їм наказано виконати, запускає дві збережені команди. Таким чином, ви можете взяти відокремлену команду «затримка» та будь-яку довільну іншу команду для створення команди із запізненням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.