什么设计模式适合这种情况?

时间:2012-09-11 16:04:52

标签: java design-patterns

我有2D液压数据,它是包含网格中每个点的深度和速度信息的多GB文本文件,分为时间步长。每个时间步长包含网格中每个点的深度/速度值。因此,您可以在每个时间步长中跟随一个点,并查看其深度/速度如何变化。我希望一次读取这个数据一次,计算各种事物 - 网格单元达到的最大深度,最大速度,水深度超过2英尺的第一个时间步数等。每个结果这些计算将是网格 - 每个点的最大深度等。

到目前为止,这听起来像是Decorator模式。但是,我不确定如何从各种计算中得到结果 - 每次计算产生不同的网格。在创建它之后我必须保留对每个装饰器的引用以便从中提取结果,或者添加一个返回不同结果的地图等的getResults()方法,这两种方法都不是理想的。

另一种选择是战略模式。每个计算都是一个不同的算法,它根据时间步长(当前深度/速度)和前一轮的结果(到目前为止的最大深度,到目前为止的最大速度等)进行操作。然而,这些先前的结果对于每次计算都是不同的 - 这意味着要么算法类变为有状态,要么成为调用者的工作来跟踪先前的结果并将它们输入。我也不喜欢策略模式,因为循环遍及时间步长成为调用者的责任 - 我想在时间步长上给“计算器”一个迭代器(根据需要从磁盘中取出它)并让它产生所需的结果。

其他限制:

  • 输入很大并且正在从磁盘读取,所以按时间步骤完全迭代一次是唯一可行的方法
  • 网格很大,因此应尽可能地进行计算

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你有一个grid_points,它有很多时间步长&每个时间步长都有深度&速度。现在有GB的数据。

我建议对数据进行一次传递。将解析的数据存储在RDBMS中。然后对此数据运行查询或存储过程。这样至少应用程序不会耗尽内存

答案 1 :(得分:0)

首先,也许我不太清楚这个问题并且错过了我的回答,在这种情况下,我为花时间道歉。

乍一看,我会想到一种更类似于“策略模式”的方法,结合面向数据的基础,类似于以下伪代码:

foreach timeStamp

  readGridData

  foreach activeCalculator in activeCalculators

    useCalculatorPointerListToAccessSpecificStoredDataNeededForNewCalculation

    performCalculationOnFreshGridData

    updateUpdatableData

    presentUpdatedResultsToUser

    storeGridResultsInDataPool(OfResultBaseClassType)

    discardNoLongerNeededStoredGridResults

  next calculator
next timeStep

再次,抱歉,如果这不合适。