如何结合“命令”和“复合”来模拟时间延迟?


9

作为一项学习练习(我不在学校,只是一个试图学习新东西的老家伙),我正在尝试编写一个包含传播延迟的逻辑门模拟。用户还应该能够将门组合在一起以创建更高级别的对象。

我想将设计模式应用于我的问题,但是我很难过。

我正在阅读Head First设计模式,并且我看到Command模式是一种通过延迟来模拟通过电路的电脉冲的好方法。我还看到Composite模式是模拟嵌套单元的好方法。我只是不知道如何混合两者。

换句话说,当我循环通过门时,我看到门“ x”应该开火。它具有15纳秒的延迟,因此我创建了一个距当前游戏时间15 ns的时间戳的命令。调度员在哪里?在晚餐的示例中,命令为“ Order”,女服务员和厨师分别发送命令并可以选择引入延迟。如果我有一个“综合”门,它也有自己的调度程序吗?我是否需要使用Singleton来管理队列?

我阅读了可以找到的内容,但仍然需要朝着正确的方向努力:


9
模式是工具。一个人不拿锤子和螺丝刀,认为我会盖房子。取而代之的是,开始盖房子并意识到用锤子可以使工作变得容易的地方。

那不能完全回答我的问题。我已经构建了一个大型Java应用程序,该应用程序从一扇门到另一扇门传递消息。但是,我尝试合并传播延迟,但发现我的应用程序设计无法轻松处理它。我希望设计模式可以帮助……
Neil Mussett

4
您正在寻找离散事件模拟 -如cron但没有“实时”。进行构建,然后确认“哦,我要在这里构建复合材料-我知道该怎么做”,而不是去寻找某种方法将复合材料加入解决方案中。

1
特别是,您可能会从ACM通讯1977年8月第20卷第8期发现模拟事件集的高效数据结构非常有用(用Google搜索该标题应提取pdf-我无法链接到它)-它经历了实现数据结构的概念,该结构大大超过了索引列表。

1
是在citeseerx上托管的ACM论文的链接。
2013年

Answers:


1

您可能想看一下Scala编程中的示例,因为它们有一个模拟器,可以完成您想在Java中进行的操作:

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

通过研究他们的方法,您可能会发现如何更改程序以获得所需的行为。

您提到您不能轻易添加它,所以为什么不解释您的方法是什么,以及遇到的困难是什么,以便人们可以为您提供一些您可能没有考虑的建议。

如前所述,设计模式可以作为一种方式来谈论您的代码在做什么,但是,试图强加设计模式的想法似乎是一个坏主意。

基本上,传播延迟不难。

您可以有一个基类Gate,并且延迟了她的时间。

所有门都从此延伸,并设置实际延迟。

现在,当您跟踪信号时,在门中时,该线程可能会在模拟延迟中进入睡眠状态,但这也意味着您需要将实时映射到模拟时间,因为模拟器会比实际系统慢将会。

如果发现线程太多,则将其放到排序列表中,再排在前一个,然后在暂停时,输入延迟完成的时间,然后在每个循环中,模拟器将选择已准备好的线程,执行下一个操作,然后发生下一个延迟。

这将类似于游戏循环。


0

换句话说,当我循环通过门时,我看到门“ x”应该开火。

那么您就不会使用命令模式。

如果我有一个“综合”门,它也有自己的调度程序吗?

亲爱的上帝 合成模式的全部要点是,您可以将合成对象提供给仅需要一个对象的位置。这使您可以合理地构成行为。

我是否需要使用Singleton来管理队列?

一定不行。您整个世界上只有一名厨师和一名女服务员吗?他们只有一个厨房吗?

混合使用命令模式和复合模式非常简单。您有一些代表命令的界面。每个具体命令都可以覆盖(或以非继承语言满足它)该接口以提供某些行为。您的延误就是这样一种简单的行为。

复合模式在单个接口后面提供了两个(或更多)对象/行为。此示例最简单的用法是使用其他两个命令的复合命令,然后在被告知执行时触发两个存储的命令。这样,您可以采用隔离的“延迟”命令和任何其他任意命令来创建延迟命令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.