请教一下,这种情况用哪个设计模式比较好呢 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 A 生成的内容
NoKey
V2EX    程序员

请教一下,这种情况用哪个设计模式比较好呢

  •  
  •   NoKey 2024-08-20 18:51:46 +08:00 2532 次点击
    这是一个创建于 419 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有个操作过程,需要执行 4 个步骤
    step1()
    step2()
    step3()
    step4()
    要按照顺序执行
    其中,step2 ,step4 要根据不同的场景进行单独开发
    step1 和 step3 是公共化步骤,大家都一样
    请问一下,哪种设计模式比较适合这个情况呢,我想着用工厂模式,但是感觉又有点不对
    工厂模式不会限制执行步骤。
    请教一下各位大佬,谢谢
    22 条回复    2024-08-22 10:07:10 +08:00
    Nosub
        1
    Nosub  
       2024-08-20 18:55:27 +08:00 via iPhone
    模板方法。
    root71370
        2
    root71370  
       2024-08-20 18:56:11 +08:00
    责任链
    wjx0912
        3
    wjx0912  
       2024-08-20 18:58:17 +08:00
    装饰器模式?
    ovtfkw
        4
    ovtfkw  
       2024-08-20 19:04:09 +08:00
    流水账模式
    31415926535x
        5
    31415926535x  
       2024-08-20 20:15:15 +08:00
    1 、step2,4 短期内如果不会膨胀很多不同的逻辑,就直接一串写下去,
    2 、如果现阶段已经较多,抽象类中控制主流程,变化的内容交给子类实现,工厂+模板
    3 、如果一定后续会增多,责任链或者流程引擎编排下子任务

    ( step1, 4 是什么内容呢,我猜是数据加载和收尾发消息等等操作,如果是的话,可以搞个 init, process, after 的模板,process 走工厂
    1008610001
        6
    1008610001  
       2024-08-20 20:20:32 +08:00
    模板,或者你把 2 和 4 抽一个接口,由调用方传进来实现调用也可以
    sagaxu
        7
    sagaxu  
       2024-08-20 20:33:26 +08:00
    最简单的方式,不用什么模式

    class Base {
    func step1()
    func step2()
    func step3()
    func step4()

    func process() {
    step1()
    step2()
    step3()
    step4()
    }
    }

    class Foo {
    override func step1()
    override func step4()
    }

    class Bar {
    override func step1()
    override func step4()
    }

    func create(...): Base {
    //根据场景实例化相应的子类
    }
    zgl263885
        8
    zgl263885  
       2024-08-20 20:35:11 +08:00 via iPhone
    命令模式?把每个步骤封装成一个个的命令,让后组合一个命令数组,由执行器去控制步骤的逐步执行以及暂停恢复等过程。另外可能会需要状态机模式来实现步骤执行的状态切换管理。
    ixixi
        9
    ixixi  
       2024-08-20 22:01:51 +08:00   1
    按我的理解是 rxjs
    mitoop
        10
    mitoop  
       2024-08-20 23:14:34 +08:00 via iPhone   2
    初步来看,模板模式 加 策略模式 ,模板实现不同场景,策略决定使用哪个场景。
    adgfr32
        11
    adgfr32  
       2024-08-21 07:40:49 +08:00
    我觉得不用模式, 先做到代码复用, 等这些步骤多到维护很麻烦再设计怎么抽象.
    设计模式本身就会增加理解成本. 当维护成本 >> 理解成本的时候才是划算的.
    RainCats
        12
    RainCats  
       2024-08-21 09:11:40 +08:00
    我可能是用责任链串起来,然后 2 和 4 用策略模式+函数式
    dododada
        13
    dododada  
       2024-08-21 09:19:15 +08:00
    说来惭愧,从来没有认真的研究过设计模式
    yule111222
        14
    yule111222  
       2024-08-21 10:10:05 +08:00
    不需要任何设计模式
    laminux29
        15
    laminux29  
       2024-08-21 10:10:37 +08:00
    如果业务复杂,建议用基于数据库的流程引擎来开发,因为方便多人协作开发+方便调试排错。

    举个简单例子,APP 跑到某一步,突然崩了,此时完整的数据过程,都在数据库,你完全可以慢慢检查,最后用数据库,直接恢复现场。
    HaibaraDP
        16
    HaibaraDP  
       2024-08-21 10:41:44 +08:00
    pipeline
    xuanbg
        17
    xuanbg  
       2024-08-21 11:07:18 +08:00
    不需要什么设计模式。教你一个万能的应对方案,就是封装。以 OP 的实际需求为例,可以把每个步骤分别封装。譬如第二步会根据不同的类型采取不同的处理方式,那就在这一步的内部,根据数据类型来进行不同的分支流程。这样,变化就被限制在内部,从而不影响其他组件。
    SuperDaFu
        18
    SuperDaFu  
       2024-08-21 13:57:24 +08:00
    责任链构建流程,每一个流程可以上命令/模板/策略维护自己的组件。
    可以用消息来驱动整个流程运转
    Pierro
        19
    Pierro  
       2024-08-21 14:00:11 +08:00
    @laminux29 这个东西有没有例子可以看看
    ilucio
        20
    ilucio  
       2024-08-21 17:44:39 +08:00
    这就是工作流系统的典型实现,最近刚写过一个,用了责任链+策略模式,把责任链换成模板模式也可以,看具体需求了。我觉得这个需求里最难的是每个 step 的
    ilucio
        21
    ilucio  
       2024-08-21 17:46:33 +08:00
    我觉得最难的是每个 step 的可忽略、可重试、可跳过设计实现。。
    monkeydream
        22
    monkeydream  
       2024-08-22 10:07:10 +08:00
    不能为了设计模式而模式,一开始还是建议先封装+组合。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5292 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 09:27 PVG 17:27 LAX 02:27 JFK 05:27
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86