Как бы я комбинировал «Command» и «Composite» для имитации временной задержки?

9

В качестве учебного упражнения (я не в школе - просто пожилой парень, пытающийся выучить что-то новое), я пытаюсь написать имитацию логических элементов, которая включает задержку распространения. Пользователь также должен иметь возможность группировать ворота для создания объектов более высокого уровня.

Я хочу применить шаблоны проектирования к моей проблеме, но мне трудно.

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

Другими словами, проходя через ворота, я вижу, что ворота «х» должны открыться. Он имеет задержку 15 наносекунд, поэтому я создаю команду с отметкой времени 15 нс от текущего игрового времени. Где диспетчер? В примере закусочной, где команда является «Заказом», официантка и повар отправляют команду и имеют возможность ввести задержку. Если у меня есть «составные» ворота, есть ли у них собственный диспетчер? Нужно ли использовать Singleton для управления очередью?

Я прочитал то, что мог найти, но мне все еще нужен толчок в правильном направлении:

Нил Массетт
источник
9
Шаблоны - это инструменты. Один не берет молоток и отвертку и думает, что я построю дом. Вместо этого начните строить дом и поймите, где молоток облегчит работу.
Это не совсем отвечает на мой вопрос. У меня уже есть большое Java-приложение, которое передает сообщения от ворот к воротам. Однако я пытаюсь учесть задержку распространения и обнаружил, что дизайн моего приложения не может легко справиться с этим. Я надеялся, что шаблоны проектирования могут помочь ...
Нил Массетт
4
Вы ищете моделирование отдельных событий - например, cron, но без «реального» времени. Создайте это и затем узнайте: «О, я строю композит здесь - я знаю, как это сделать», вместо того, чтобы искать и искать способ втиснуть композит в решение.
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 для управления очередью?

Конечно нет. У вас есть только один повар и одна официантка во всем мире? У них есть только одна кухня?

Смешивать команду и составной шаблон довольно просто. У вас есть некоторый интерфейс, который представляет команду. Каждая конкретная команда может переопределить (или иным образом удовлетворить ее на языках, не являющихся наследниками) этот интерфейс, чтобы обеспечить некоторое поведение. Ваша задержка является одним из таких простых действий.

Составной шаблон обеспечивает два (или более) объекта / поведения за одним интерфейсом. Простейшим использованием в этом примере будет составная команда, которая принимает две другие команды, а затем, когда им приказывают выполнить, запускает две сохраненные команды. Таким образом, вы можете использовать свою изолированную команду 'delay' и любую другую произвольную команду для создания отложенной команды.

Telastyn
источник