各位在工作中设计模式到底用得多吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
ZhengZW
V2EX    程序员

各位在工作中设计模式到底用得多吗?

  •  
  •   ZhengZW 2019-08-15 11:48:22 +08:00 7597 次点击
    这是一个创建于 2250 天前的主题,其中的信息可能已经有所发展或是发生改变。

    除了工厂和单例和代理,有没有用到其他的,工作到现在用最多就工厂和单例,想问问你们用过哪些,应用啥场景?

    34 条回复    2019-08-18 10:12:25 +08:00
    yule111222
        1
    yule111222  
       2019-08-15 11:57:00 +08:00   1
    挺多的,适配器最多,调用远程接口或者接口变换的时候用
    长业务流程责任链
    构建复杂对象建造者
    迭代一个自定义复杂数据结构,迭代器
    生产消费者(生产令牌,IP,线程等各种资源提供给消费者使用)
    接口聚合,门面模式
    工厂和单例和代理就不说了,你也用了
    cwjokaka
        2
    cwjokaka  
       2019-08-15 12:02:08 +08:00
    模板方法,最近写了个服务初始化配置的脚本,把一些固定的流程 /异常处理写在抽象类中,达到代码的最大重用
    Caballarii
        3
    Caballarii  
       2019-08-15 12:11:37 +08:00
    学过设计模式至少能让你有好好组织拆分代码的意识,动手之前多想想后面的事
    taogen
        4
    taogen  
       2019-08-15 12:12:13 +08:00 via Android   5
    时间紧,先 Ctrl C, V 把功能实现完,打算有时间优化,然后就没有然后了。造成大量代码冗余
    IsaacYoung
        5
    IsaacYoung  
       2019-08-15 12:14:33 +08:00 via iPhone
    我用的最多的是 todo 模式

    //TODO: DRY
    nekoyaki
        6
    nekoyaki  
       2019-08-15 12:26:08 +08:00
    也分语言,在某语言里需要长篇累牍,特意起一个高端大气上档次的名词,包装成一个设计模式,可能在另一个语言里一行就完事儿了。
    skypyb     7
    skypyb  
       2019-08-15 12:44:19 +08:00
    多,策略、责任链、工厂、建造者 都有用到
    mirrorman
        8
    mirrorman  
       2019-08-15 12:50:55 +08:00
    记得前段时间找实习面我的 Leader 让我写 Observer 模式和 Builder 模式,然后对我说一看就没看过源码,一脸懵逼
    Raymon111111
        9
    Raymon111111  
       2019-08-15 14:48:50 +08:00
    模板应该是比较多的
    orzorzorzorz
        10
    orzorzorzorz  
       2019-08-15 14:52:05 +08:00   1
    设计模式这玩意从来都是水到渠成的事,强行上虽然解渴,但是不甜
    是的,我几乎用不到设计模式
    stevenkang
        11
    stevenkang  
       2019-08-15 14:53:33 +08:00
    请教大家一下,这算不算一种模式呀?

    原来的
    ```
    void typeProfcess(type) {
    if (type == 'A1') {
    // todo something
    } else if (type == 'B2') {
    // todo something
    } else {
    // todo something
    }
    }
    ```
    改造后
    ```
    static {
    typeprocess.put('A1', a1TypeProcessListener)
    typeprocess.put('A2', b2TypeProcessListener)
    default = defaultTypeProcessListener
    }

    void typeProfcess(type) {
    listener = typeprocess.containsKey(type) ? typeprocess.get(type) : default
    listener.exec()
    }

    ```
    这样无论以后的 type 多复杂,只需要初始化的时候 put 进去对应的处理就好了。
    特别是第三方系统各种报文 type,以前用 if 或者 switch 处理,这样改造了会不会更好?
    airfling
        12
    airfling  
       2019-08-15 14:56:51 +08:00
    主要用到过适配器模式,还是在子类型比较多的时候总体优化了一下才用的
    12tall
        13
    12tall  
       2019-08-15 15:55:23 +08:00
    挺多的,但是刻意学却总也记不住,直到有一天业务需要了,马上就明白了,大概是这个样子
    一些重构的骚操作大概也是这个样子
    freebird1994
        14
    freebird1994  
       2019-08-15 16:12:21 +08:00
    @stevenkang 用策略模式更好,你这个维护的时候还是会修改原有的代码,策略模式只对扩展开放,对修改关闭。
    Joyboo
        15
    Joyboo  
       2019-08-15 17:16:20 +08:00
    设计模式非常常用
    javaWeber
        16
    javaWeber  
       2019-08-15 17:19:12 +08:00   1
    我学了几次。。但是学了又忘了。

    重构代码时,发现很多重复代码。但是又不知道用哪个设计模式。

    一直处于理论阶段,没有实操过。
    yukong
        17
    yukong  
       2019-08-15 17:19:39 +08:00
    @stevenkang #11 建议使用策略模式使用策略模式 之后如果有新的规则 只需要实现策略接口 重写策略方法 不会对原代码进行修改
    Takamine
        18
    Takamine  
       2019-08-15 18:38:20 +08:00 via Android
    @stevenkang 虽然改了一下形式,但是感觉耦合度还是差不多的。比如添加一个 A4 的时候,依然还是要在这里做操作。
    MeteorCat
        19
    MeteorCat  
       2019-08-15 19:03:52 +08:00 via Android
    单例模式最多
    zjsxwc
        20
    zjsxwc  
       2019-08-15 19:19:03 +08:00 via Android
    也就拼 sql 时 builder 模式天天用
    Shiyq
        21
    Shiyq  
       2019-08-15 19:56:58 +08:00
    都是大佬,我最多继承几个基类搞搞,也不知道那是不是设计模式
    JerryCha
        22
    JerryCha  
       2019-08-15 20:11:59 +08:00
    没具体看过设计模式,看 Google 官方的 Android 案例看得挺懵的
    itechify
        23
    itechify  
    PRO
       2019-08-15 20:53:09 +08:00 via Android
    @stevenkang 类似策略模式
    justin2018
        24
    justin2018  
       2019-08-15 20:59:12 +08:00
    先完成需求 然后等有时间了在重构~~

    一般有时间的情况非常少~~
    justfortest
        25
    justfortest  
       2019-08-15 21:56:05 +08:00
    一般单例、工厂、适配器之类的都会用到
    BigDogWang
        26
    BigDogWang  
       2019-08-15 22:34:54 +08:00
    @yukong 我思量着策略模式新增策略不是也要修改工厂类吗
    pastgift
        27
    pastgift  
       2019-08-15 22:35:49 +08:00   2
    设计模式是编码经验的总结,所以实际上是现有代码,后有设计模式。

    代码写多了,写出来的代码自然就带这某种设计模式。
    而不是说为了用某个设计模式然后照着写代码,模式就是套路( pattern ),是一种指导,不要搞成 template 了
    BigDogWang
        28
    BigDogWang  
       2019-08-15 22:38:06 +08:00
    @yukong 新增策略不需要改动工厂类吗
    ChefIsAwesome
       29
    ChefIsAwesome  
       2019-08-15 23:41:22 +08:00 via Android   2
    最常见的,套一层模式。例如写 API,调 API 的时候,通常在真正的实现前面加一层,这里头有可能有 proxy,有可能有装饰器,有可能有适配器。
    所有的封装,都是 facade。
    现在做界面,都是 mvc。
    队列,错误回滚,是 command。
    俩模块通过共享的父模块通信,是中间人模式。
    各种配置初始化的过程,都包括 template method。
    有些做游戏的,为了帧数稳定,会搞个内存池,自己控制内存释放。
    做响应式开发的 rx,有迭代器,有 observer,有 command,有惰性求值。rx 是个函数式编程的产物。
    做前端写 react 的应该熟悉:HOC 是装饰器。各种 life cycle 的配置是模板方法。对比以前的 mixin 和现在的 hook,是明显的 Composition over inheritance 的设计思维。

    设计模式是问题+解决策略+实现方法。有的问题是面向对象独有的,有的是不分编程语言的。那些个模式到处都在用,死记硬背没意义。
    129ykx733D016U2n
        30
    129ykx733D016U2n  
       2019-08-16 00:21:01 +08:00
    其实并没有严格按照书本上的设计模式什么的,那只是一种思路,只要逻辑清晰,顺手,不影响性能,怎么写都可以,没有必要严格按照书本上的代码模式写
    q397064399
        31
    q397064399  
       2019-08-16 06:03:12 +08:00   2
    1. 不必严格按照模式去做,去生搬硬套
    2. 关键掌握设计模式的或者说是各种模式的真正精髓 SOLID 原则
    其实在我看来就 Bob Martin 在敏捷软件开发中讲的那样
    面向对象或者套用各种模式 最终的目的是 -- 隔离变化,我们创建抽象的本质是将不易变的跟容易变的部分隔离开来

    举个简单的栗子:
    我们有一个冒泡排序算法 通常的写法是
    for ..
    for ..

    但是你想过一个问题没有,冒泡排序的算法框架大致上是不变的,变化的是什么,被排序的数据结构,
    你可能要为一群人这个集合排序 有可能要为一堆数字排序,它们这些抽象的数据表示 可能存在不同的数据结构里面
    有可能是 Map 有可能是 Set 有可能是 List
    那么隔离它们的这些变化的方式就是提供一个抽象的约定,将高层次的逻辑与低层次的数据隔离开来

    swap(a,b)

    compare(a,b)

    get(a,b)

    当这个约定被解构出来的时候,我们双重 for 循环的冒泡算法就再也不用修改了,这样会大大减少程序员的心智负担,对于新增的排序需求,我们只要让它符合中抽象就可以了
    Solace202
        32
    Solace202  
       2019-08-16 08:02:56 +08:00 via Android
    马士兵老师说过,如果学习设计模式的难度是 50,那么用到项目中的难度就是 300,这个我是一只赞同的
    LeeSeoung
        33
    LeeSeoung  
       2019-08-16 14:01:00 +08:00
    其实写的很多代码都是设计模式的变种或者组合
    hhhsuan
        34
    hhhsuan  
       2019-08-18 10:12:25 +08:00
    @stevenkang #11 算是一点策略模式再加一点数据驱动吧。还可以写的更好一点,比如做成动态注册的形式,这样添加新的 type 就不需要修改那个 static 代码块。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5899 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 03:19 PVG 11:19 LAX 20:19 JFK 23:19
    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