请教一下,这种情况用哪个设计模式比较好呢 - V2EX
请不要在回答技术问题时复制粘贴 AI 生成的内容
NoKey

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

  •  
  •   NoKey Aug 20, 2024 3000 views
    This topic created in 630 days ago, the information mentioned may be changed or developed.
    有个操作过程,需要执行 4 个步骤
    step1()
    step2()
    step3()
    step4()
    要按照顺序执行
    其中,step2 ,step4 要根据不同的场景进行单独开发
    step1 和 step3 是公共化步骤,大家都一样
    请问一,哪种设计模式比较适合这个情况呢,我想着用工厂模式,但是感觉又有点不对
    工厂模式不会限制执行步骤。
    请教一下各位大佬,谢谢
    22 replies    2024-08-22 10:07:10 +08:00
    Nosub
        1
    Nosub  
       Aug 20, 2024 via iPhone
    模板方法。
    root71370
        2
    root71370  
       Aug 20, 2024
    责任链
    datadump
        3
    datadump  
       Aug 20, 2024
    装饰器模式?
    ovtfkw
        4
    ovtfkw  
       Aug 20, 2024
    流水账模式
    31415926535x
        5
    31415926535x  
       Aug 20, 2024
    1 、step2,4 短期内如果不会膨胀很多不同的逻辑,就直接一串写下去,
    2 、如果现阶段已经较多,抽象类中控制主流程,变化的内容交给子类实现,工厂+模板
    3 、如果一定后续会增多,责任链或者流程引擎编排下子任务

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

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

    举个简单例子,APP 跑到某一步,突然崩了,此时完整的数据过程,都在数据库,你完全可以慢慢检查,最后用数据库,直接恢复现场。
    HaibaraDP
        16
    HaibaraDP  
       Aug 21, 2024
    pipeline
    xuanbg
        17
    xuanbg  
       Aug 21, 2024
    不需要什么设计模式。教你一个万能的应对方案,就是封装。以 OP 的实际需求为例,可以把每个步骤分别封装。譬如第二步会根据不同的类型采取不同的处理方式,那就在这一步的内部,根据数据类型来进行不同的分支流程。这样,变化就被限制在内部,从而不影响其他组件。
    SuperDaFu
        18
    SuperDaFu  
       Aug 21, 2024
    责任链构建流程,每一个流程可以上命令/模板/策略维护自己的组件。
    可以用消息来驱动整个流程运转
    Pierro
        19
    Pierro  
       Aug 21, 2024
    @laminux29 这个东西有没有例子可以看看
    ilucio
        20
    ilucio  
       Aug 21, 2024
    这就是工作流系统的典型实现,最近刚写过一个,用了责任链+策略模式,把责任链换成模板模式也可以,看具体需求了。我觉得这个需求里最难的是每个 step 的
    ilucio
        21
    ilucio  
       Aug 21, 2024
    我觉得最难的是每个 step 的可忽略、可重试、可跳过设计实现。。
    monkeydream
        22
    monkeydream  
       Aug 22, 2024
    不能为了设计模式而模式,一开始还是建议先封装+组合。
    About     Help     Advertise     Blog     API     FAQ     Solana     2795 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 455ms UTC 15:39 PVG 23:39 LAX 08:39 JFK 11:39
    Do have faith in what you're doing.
    ubao msn 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