t298
V2EX  ›  问与答

菜鸡 Java 求一个解决方案。

  •  
  •   t298 · Nov 18, 2024 · 1623 views
    This topic created in 571 days ago, the information mentioned may be changed or developed.

    我们是做水利模型的业务的,大家可以理解为一条河流,从上游到下游有若干个水库,水电站什么的,现在像这样的有 19 个,可以理解为一个水库就是一个模型。 现在要灵活的决定那些参与计算,那些不参与计算,比如 c 水库参与计算,那么后面的 d 就要用 c 的结果,如果不参与计算,那么 d 用的就是上一个 b 的结果,以此类推,这个应该怎么设计?

    7 replies    2024-11-18 17:27:51 +08:00
    JoeDH
        1
    JoeDH  
       Nov 18, 2024
    Pipeline 模式
    nice2cu
        2
    nice2cu  
       Nov 18, 2024
    咋感觉可以用一个 19 位的二进制表示,通过移位判断下一个 1 ,即开启的,然后参与计算
    nice2cu
        3
    nice2cu  
       Nov 18, 2024
    @nice2cu 或者 19 个入库,根据 sort 排序 依次找到下一个开启的 然后做处理 感觉都行的吧 处理方法简单一点就
    while(hasNext()){
    operate()
    }
    orzorzorzorz
        4
    orzorzorzorz  
       Nov 18, 2024
    获得上一个水库结果 -> 在当前水库判断是否使用上游数据,最后生成结果,或计算,或使用上游数据 -> 获得上一个水库结果 -> ...
    递归完事。
    yosoroAida
        5
    yosoroAida  
       Nov 18, 2024
    赞同用 1 楼的,你可以看看责任链模式的例子,例如 Java web 的 Filter 是怎么组装的,它的组装其实就是 Pipeline 模式的例子
    manhere
        6
    manhere  
       Nov 18, 2024
    不必那么复杂,直接做成顺序的就行,如果 c 不参与计算,则 c 直接返回 b 的结果做个短路就行。
    yosoroAida
        7
    yosoroAida  
       Nov 18, 2024
    或者你也考虑下用装饰器模式,具体例子就是 MyBatis 的 <where> ,<if> 这些标签是怎么连起来的:

    SqlNode 接口的还有它的实现类,还有 DynamicSqlSource 的 getBoundSql() 的方法。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2473 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 00:38 · PVG 08:38 · LAX 17:38 · JFK 20:38
    ♥ Do have faith in what you're doing.