设计模式

2 天前
 young1
怎样才能学好设计模式,有什么好的教程推荐呢,各位大佬
2893 次点击
所在节点    程序员
33 条回复
wjfz
1 天前
@BeautifulSoap #6 那两种反应太真实了
lz234561
1 天前
大话设计模式,这个确实可以的。
q8164305
1 天前
设计模式本质上是可有可无的,如果代码简单,完全不需要任何任何设计模式,设计只是更好的一种组织代码的方式,方便和别人交流,减少沟通成本罢了,只有写了足够多的麻花一样,绕来绕去的代码,重构的时候才能理解设计模式的强大,设计模式只是一种组织代码的结构而已,不是必须的
ilvsxk
1 天前
不用太纠结,当行业黑话来理解。
mascteen
1 天前
用函数编程,设计模式只有一个, 就是函数
NoOneNoBody
1 天前
设计模式的主要思想是抽象化,写通用代码时用的,如果业务流程非常独特,就没必要了

项目使用设计模式 A
如果项目大更新,就要换一个设计模式 B ,那设计模式 A 对于该项目来说,就是专有的,并非通用的,这个 A 其实就是没必要的
如果项目大更新,仍然能使用 A ,只是改动模块,甚至模块换了新技术也能延续,这个 A 才是通用的

例如
设计模式目标是人员管理,项目初始为学生,第一次更新需要拓展到交换生,第二次更新需要拓展到教师,第三次更新需要拓展到校工……多次更新,只需要修改或添加少量模块,那么这个设计模式才是通用的
如果每次更新都要重写,例如最初是单例,第一次变为装饰器,第二次变为共享,第三次变为组合……不是不可以,只是模式变,思维和逻辑也跟着变,就没有“设计”了,只是每次推倒重来而已
所以设计模式需要一定大局观和预见性,能从一堆不同的东西抽象出共性的东西

又如
有多个函数,各自的目的、计算都不同,但它们有个共同的特征:都是两个参数,一个为序列,一个为单值,返回都是序列。这样,其实可以抽象出一个闭包函数 func(array, value),返回序列
同理可以造一个抽象类,将不同的实际类(学生类、教师类、校工类),都能套上
抽象类作为入口,根据实际情况,可能是平衡的,可能是有序的,可能是父子的,使用不同的实际类处理数据,完成这个或多个抽象类及其实现过程,就是设计模式了

现实中的各种模板,就是设计模式的实例,例如下载个开源商城,你卖食品、工业品、虚拟品,什么都能套上,这个开源商城就是用一套设计模式写成的,它里面变化的只是商品数据、商品分类以及支付方式
还有各种论坛源码等等都是
计算机语言本身就是一个设计模式,不同语言基本都离不开 变量、表达式、命令句、函数……这些共性的东西

题外:汉语成语就是抽象类,能把不同的人想表达的长句、组句、甚至上百字的解释,抽象为四个字。只要说的和听的都懂这个成语,双方就能顺利沟通。
所以#14 所说的“共识”也是对的,他甚至把我上面这一大段话抽象为两个字了 🎉
Oktfolio
1 天前
风气变了?怎么 20 个小时了还没人出来骂 Java?
sillydaddy
1 天前
如果你仔细观察那么多设计模式,会发现它们基本上都是在讲一件事:接口的抽象、分层、去耦合, 就像 #26 楼 @NoOneNoBody 说的。把这点仔细研究研究,就豁然开朗了。

举几个例子,

「观察者模式」: 某个对象变动了,通知其他对象(或者说其他对象观察某个对象的变动)。 这种“一变动就通知”的机制,主要用于底层对象向上层对象发送通知,对于这些通知,无论上层对象是处理还是不处理,无论上层具体怎样处理,都跟底层对象没有关系了。所以观察者模式,其实是将底层对象的向上通知这种(接口)行为统一抽象出来了,而且去掉了底层与上层的耦合。
「访问者模式」:将被访问的数据结构的遍历抽象出来了,上层要访问某个比较固定的数据结构的时候,不用每个访问者把遍历这个数据结构的代码都重复写一遍,只需要写出来对该数据结构如何具体操作,遍历这个数据结构的过程已经被“访问者模式”抽象和剥离出来了。像 C++ stl 的迭代器也可以算是非常典型的访问者模式,只需要 iterator++就可以,不用关心底层是 vector 还是 list 。
「工厂模式」:这个就更直接了,传给工厂一个不同的参数,生成一个与之对应的实例,并且这些实例都实现了一个相同的接口。具体生产哪个类的实例不需要关心,唯一需要关心的就是,传入一个不同的参数,得到同一个接口的不同实现,经过这种抽象后,工厂模式对外呈现出一种极为简洁的形式:不同参数->接口的不同实现。


所以学习的时候,只要仔细留心接口是怎样抽象的,接口抽象出来后,达到了什么目的和效果,就可以了,不用特意记各种设计模式,死记也记不住。
Leviathann
1 天前
@mascteen 那各种 Monad 、functor 、typeclass 算什么
securityCoding
1 天前
不知道执着这个东西 ,堆久了都是💩
Nosub
1 天前
刚好今年我阅读了一本设计模式的书籍《 C++ Software Design 》,我认为把设计模式讲的最深刻的,只有英文版。

https://nosub.net/posts/p/160
chiaf
1 天前
[免费在线学习代码重构和设计模式]( https://refactoringguru.cn/)

这个网站设计模式有中文,代码重构没有

代码示例部分的语言包含了 C# C++ Go JAVA PHP Python Ruby Rust Swift TS
mascteen
18 小时 2 分钟前
@Leviathann 函数用多了之后,自然的衍生,他并不是什么新的东西,只是一个概念名词

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1094504

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX