V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
t298
V2EX  ›  问与答

菜鸡 Java 求一个解决方案。

  •  
  •   t298 · 13 天前 · 759 次点击

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

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

    SqlNode 接口的还有它的实现类,还有 DynamicSqlSource 的 getBoundSql() 的方法。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2600 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 10:33 · PVG 18:33 · LAX 02:33 · JFK 05:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.