В качестве учебного упражнения (я не в школе - просто пожилой парень, пытающийся выучить что-то новое), я пытаюсь написать имитацию логических элементов, которая включает задержку распространения. Пользователь также должен иметь возможность группировать ворота для создания объектов более высокого уровня.
Я хочу применить шаблоны проектирования к моей проблеме, но мне трудно.
Я читаю шаблоны проектирования Head First , и вижу, что шаблон Command - это хороший способ для имитации электрических импульсов в цепи с задержкой. Я также вижу, что шаблон Composite является хорошим способом для моделирования вложенных модулей. Я просто не знаю, как их смешать.
Другими словами, проходя через ворота, я вижу, что ворота «х» должны открыться. Он имеет задержку 15 наносекунд, поэтому я создаю команду с отметкой времени 15 нс от текущего игрового времени. Где диспетчер? В примере закусочной, где команда является «Заказом», официантка и повар отправляют команду и имеют возможность ввести задержку. Если у меня есть «составные» ворота, есть ли у них собственный диспетчер? Нужно ли использовать Singleton для управления очередью?
Я прочитал то, что мог найти, но мне все еще нужен толчок в правильном направлении:
Ответы:
Возможно, вы захотите взглянуть на пример из программирования на Scala , поскольку у них есть симулятор, который делает то, что вы пытаетесь делать на Java:
http://www.cs.helsinki.fi/u/wikla/OTS/Sisalto/examples/html/ch30.html#sec6
Взглянув на их подход, вы можете узнать, как изменить программу, чтобы получить желаемое поведение.
Вы упомянули, что вы не можете добавить это легко, так почему бы не объяснить, каков ваш подход, и в чем сложность, с которой вы сталкиваетесь, чтобы люди могли дать вам некоторые предложения, которые вы, возможно, не рассмотрели.
Как уже упоминалось, шаблоны проектирования - это способ для краткого описания того, что делает ваш код, но идея пытаться навязать шаблоны проектирования просто кажется плохой идеей.
По сути, задержка распространения не должна быть сложной.
У вас может быть базовый класс, который есть
Gate
, и в нее вкладывают задержку.Все ворота выходят из этого и устанавливают фактическую задержку.
Теперь, когда вы следуете сигналу, находясь в шлюзе, этот поток может находиться в режиме ожидания для смоделированной задержки, но это также означает, что вам необходимо сопоставить реальное время с вашим смоделированным временем, поскольку ваш симулятор будет работать медленнее, чем реальная система. было бы.
Если вы обнаружите, что у вас слишком много потоков, просто поместите их в отсортированный список, на следующий сверху сверху, а когда вы сделаете паузу, просто укажите время, когда задержка завершена, и в каждом цикле симулятор выберет те, которые уже готовы. , выполните следующее действие, и затем произойдет следующая задержка.
Это было бы похоже на игровой цикл.
источник
Тогда вы не используете шаблон команды.
Дорогой бог нет. Весь смысл составного шаблона состоит в том, что вы можете предоставить составной объект в местоположение, которое ожидает только один объект. Это позволяет вам составлять поведение разумным способом.
Конечно нет. У вас есть только один повар и одна официантка во всем мире? У них есть только одна кухня?
Смешивать команду и составной шаблон довольно просто. У вас есть некоторый интерфейс, который представляет команду. Каждая конкретная команда может переопределить (или иным образом удовлетворить ее на языках, не являющихся наследниками) этот интерфейс, чтобы обеспечить некоторое поведение. Ваша задержка является одним из таких простых действий.
Составной шаблон обеспечивает два (или более) объекта / поведения за одним интерфейсом. Простейшим использованием в этом примере будет составная команда, которая принимает две другие команды, а затем, когда им приказывают выполнить, запускает две сохраненные команды. Таким образом, вы можете использовать свою изолированную команду 'delay' и любую другую произвольную команду для создания отложенной команды.
источник