设计模式的作用

article/2025/8/15 3:36:57

这几天一边搞论文,一边学设计模式。真的是搞得我头昏脑胀,隐约明白设计模式是一种规范,一种体系。接到一个棘手或大型的项目,通过经验丰富或者领导的拆解,拆成一个个小的项目模块。然后让其他人去实现。会有一些约定俗成的语言。这篇文章讲的挺好。搬运过来以后常翻常看。侵删

  • 01 设计模式的本质

说起设计模式,就不得不说起重构。在 之前,当我还是一个工作 3 年的菜鸟,我重构了公司一个十几年的老系统,弄得心力交瘁。为了能深刻吸取这次重构的教训,我写了一篇文章记录这次重构的心得。

现在我再次刷了一遍设计模式相关知识,这次我对设计模式有了更深刻的认识。所以今天我们就来聊聊:设计模式的本质是什么?它的存在有什么价值?学了设计模式有什么好处?

在这篇文章中,我对设计模式的总结是:设计模式用于承载复杂的业务逻辑,使写出的代码简洁、易扩展。简单地说,你需要去了解业务中哪些是变化的,哪些是不变的。这些变化的东西就是复杂的业务逻辑,你需要思考如何用一种合适的设计模式去承载它,使得当它发生变化的时候,能具有很好的扩展性。这时候如果你学过设计模式,对每种设计模式的使用场景都谙熟于心,那你做起来会更加得心应手。

有些人说,我看有些人也没学过设计模式,但他们代码也写得挺好啊。这里我想表达我的第二个观点:抽象思维才是设计模式的内核。有些人接触的项目多了,其在项目中不知不觉地就用到了一些设计模式。这些人一般都具有一个共同点:抽象总结能力强。他们接触到了东西多了,会不断思考他们的共同之处,然后试图总结出经验。如果你具有这种抽象的思维,那即使你没看过设计模式,你也能写出类似于设计模式的代码。甚至到最后,你也可以设计出一种独特的设计模式。到时候你可能就成为了自创门派的「一代宗师」了。

  • 02 设计模式的价值

对于设计模式,不少人也有很多见解。有的人觉得设计模式名过其实,实际编程中远远没有那么重要。在我看来,设计模式存在即合理,至少它有下面三点实在的意义。

设计模式是经验沉淀,便于后来者快速学习。人类之所以能一代更比一代强,靠的就是用文字符号实现经验传承。而在编程领域,我们的设计模式其实就是前人在实战中的经验总结,他们将这些经验归纳出来成为设计模式。

对于经验不是很多的人来说,学习设计模式可以让他们有个初步的印象,等到他们有对应的项目经验时,他们可以更好地应用上。而对于项目经验丰富的人来说,设计模式可以丰富他们的项目场景,进一步提高他们对于复杂场景的掌控。

设计模式可以方便交流。有些同学会觉得一些设计模式自己都用过,只不过先辈们给它起了个名字而已,没什么大不了的。但不知道这位同学是否有思考过:为什么要给各个设计模式起一个名字?

我们得知道有显性知识和隐性知识之分。显性知识就是大家一说,我们都能听得懂的。例如锤子可以用来钉钉子,例如搜索引擎可以用来搜索知识。而隐性知识则是指那些我们做事的经验,我们很难描述出来的东西。

我们这里说的设计模式,落地下去其实就是对应的代码结构。但我们如何将这种实战中的经验描述出来呢?一个最直接的方法是:我每次跟别人交流的时候,我都说:你这个创建一个接口,然后这个类继承这个接口,然后可能你说了半天,人家也还没听懂。即使听懂了,你下次还是得叽里呱啦说半天,别人才能听得懂。

怎样才能让别人一下子领会到我们的意思呢?很简单,就是给这种代码结构起个名字嘛!这也才有了工厂方法、策略模式、模板模式这些名词。当你跟别人一说这个名字,别人就知道是怎么回事,这不就大大提高了沟通效率吗!

生活中其实也有很多类似的例子。我们为什么会有很多思考模型,例如:SMART 模型、PDCA 模型?本质上就是用来帮助记忆,以及便于沟通的。

想想看「搜索引擎」这个词,在 50 年前还不存在,那为什么有搜索引擎这个词呢?不就是为了便于交流,让别人知道是怎么回事吗?假设没有「搜索引擎」这个词,我们要描述百度,我们得怎么描述?我们试一下:就是你打开一个网页,输入词语,然后会挑出来一大堆相关的信息。这样还是挺麻烦的吧。

想想「五花肉」这个词,可能在古代还真没这个词。那我们要怎么形容?古代人说:就是那种一点肥、一点瘦的猪肉。现代人三个字搞定:五花肉!多高效啊!

  • 03 学设计模式的好处

聊完了设计模式的本质和意义,最后我们聊聊设计模式的好处。

提高系统设计能力,代码更简洁,更易于扩展。在互联网公司干过的都知道,研发流程里最确定的东西就是变化本身。需求是不可能一成不变的,唯一不变的就是需求会一直变。这就对研发人员提出了更高的要求,需要在系统设计的时候考虑到后续的扩展。

设计模式本质上就是对变化的封装,用结构化的代码结构去承载变化的需求。当你明白这一点后,你需要做的就是去分析出系统中变化的部分,之后采用合适的设计模式(代码结构)去实现。只要变化的部分拆解得好,那你就有足够强大的结构去应付变化的需求。

在这一个层次上,考验的其实是你对业务的理解,还有你掌握的设计模式的数量。这些将直接决定你是否能抽离出变化的部分,而抽离出变化的部分之后,你能不能找到合理的设计模式去承载。如果找不到,那你的「抽象思维」层次决定了你是否能自我创造一种设计模式。

设计模式可以帮助阅读源码、写框架。在我们现在使用的不少框架中,都使用了很多的设计模式。越是底层的系统,他们就需要越抽象,他们使用到的设计模式就越多。例如:Spring 框架中使用到的设计模式就多达十几种,有工厂模式、代理模式、模板模式等等。

当你理解了这些设计模式之后,你再去阅读源码,你就能够更快速地领会框架作者的意思。否则你看源码只会像看天书一样,完全看不懂,还吐槽这代码怎么这么垃圾。

设计模式有利于你面试。这点可以说是挺功利的一点,但也确实是最实在的一点。工作三年以上的工程师,至少要会学习一些设计模式。只有掌握了合理的设计模式,你写的功能才能更易于扩展。这也是我们这些工作多年的老码农,和刚毕业的小年轻的区别。

如果你工作了好几年,写代码的时候还是从头写到尾短平快,不考虑一点扩展性,那么你可能真的很容易被替代。现今的面试中,也越来越考察面试者的代码编写能力了。掌握设计模式的思维方式,可以帮助你在面试中拿到更多的筹码、赢得更高的薪资。

  • 04 小结

设计模式本质上是用于承载变化的业务逻辑,使写出的代码简洁、易扩展。它们就像武功中的招式,但具体的招式并不是目的,抽象思维才是设计模式的内核。掌握了抽象的思维,你也能设计出属于自己的模式。

设计模式是前人经验的总结,便于后来者快速学习。设计模式与菜名、标签一样,是对代码结构的一种描述,便于我们交流。掌握了设计模式,能够让我们提高系统设计能力,使系统更易于扩展。同时也能让我们读源码、写框架时事半功倍。

在这里插入图片描述

1转载自:微信公众号:陈树义,ID:gh_b6f5025d4a8d
2转载自:https://baijiahao.baidu.com/s?id=1693904127966314412&wfr=spider&for=pc


http://chatgpt.dhexx.cn/article/TEOLgy49.shtml

相关文章

设计模式概述 以及 23种设计模式的介绍

设计模式概述(Design pattern): 设计模式:代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相…

设计模式(一)设计模式的分类与区别

文章目录 一、设计模式的六大原则1.1 开闭原则(总原则)1.2 里氏替换原则1.3 依赖倒置原则1.4 单一职责原则1.5 接口隔离原则1.6 迪米特法则1.7 合成复用原则 二、设计模式的三大类别2.1 创建型模式2.2 结构型模式2.3 行为型模式 三、设计模式的使用3.1 设…

Java中常用的设计模式

文章转载借鉴:http://blog.csdn.net/zhangerqing 一、什么是设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可…

23种设计模式概述

设计模式共有23种,创建型模式5种,结构型模式7种,行为型模式11种,本章只做概念性说明。 (一) 创建型模式 01 工厂模式 定义:又叫做静态工厂方法,定义一个用于创建对象的接口&#…

常用的几种设计模式详解

设计模式的概述 设计模式分类 创建型模式 特点是将对象的创建与使用分离(解耦),有 单例、原型、工厂方法、抽象工厂、建造者等5种。 结构型模式 用于描述如何将类或对象按某种布局组成更大的结构,代理、适配器、桥接、装饰、享元…

深度学习之对抗网络

一. 对抗网络的由来 对抗网络 是个新词,全名叫 生成式对抗网络(Generative adversarial nets),就像深度学习一样,发明时间并不长。 Ian Goodfellow(生成对抗性网络的发明者)定义了 对抗网络; Yann LeCun(三巨头之一)在Quora上直播时表示生成对抗性网络近期人工智能最…

[论文]鲁棒的对抗性强化学习

[论文]鲁棒的对抗性强化学习 摘要1.简介1.1RARL综述 2.背景2.1 MDPs中的标准强化学习2.2 两人零和折扣游戏 3.鲁棒的对抗式RL3.1 对抗智能体的鲁棒控制3.2 提出方法:RARL 结论 摘要 深度神经网络与快速模拟和改进的计算相结合,导致了最近在强化学习领域的成功。然而…

融合transformer和对抗学习的多变量时间序列异常检测算法TranAD论文和代码解读...

一、前言 今天的文章来自VLDB TranAD: Deep Transformer Networks for Anomaly Detection in Multivariate Time Series Data 论文链接:https://arxiv.org/pdf/2201.07284v6.pdf代码地址:https://github.com/imperial-qore/TranAD 二、问题 在文章中提出…

【深度学习】深入浅出对抗机器学习(AI攻防)

【深度学习】深入浅出对抗机器学习(AI攻防) 文章目录 1 Attack ML Model概述 2 基本概念 3 攻击分类 4 经典的对抗性样本生成算法 5 经典的对抗防御方法 6 人工智能安全现状概析1 Attack ML Model概述 随着AI时代机器学习模型在实际业务系统中愈发无处不在,模型的安全性也变…

基于噪声伪标签和对抗学习的医学图像分割标注高效学习

目录 背景: 面临问题: 解决方案: 一 没有图像标注对的学习 二 为训练图像生成伪标签 2.1 为训练图像生成伪标签 2.2 VAE-Based鉴别器 2.3 鉴别器引导的发生器信道校准 这里有不太理解 (未写完) 三 从嘈杂的伪标…

【论文推荐】了解《对抗学习》必看的6篇论文(附打包下载地址)

论文推荐 “SFFAI139期来自美国莱斯大学的傅泳淦推荐的文章主要关注于基础研究的对抗学习领域,你可以认真阅读讲者推荐的论文,来与讲者及同行线上交流哦。” 关注文章公众号 回复"SFFAI139"获取本主题精选论文 01 The Lottery Ticket Hypothes…

对抗机器学习——Universal adversarial perturbations

代码地址: https://github.com/LTS4/universal 核心思想: 本文提出一种 universal对抗扰动,universal是指同一个扰动加入到不同的图片中,能够使图片被分类模型误分类,而不管图片到底是什么。示意图: 形…

【强化学习】模仿学习:生成式对抗模仿学习

★★★ 本文源自AI Studio社区精品项目,【点击此处】查看更多精品内容 >>> 模仿学习– 生成式对抗模仿学习 1. 模仿学习 模仿学习(imitation learning)不是强化学习,而是强化学习的一种替代品。模仿学习与强化学习有相同…

最新综述:图像分类中的对抗机器学习

目录 1.引言 2.论文贡献 3.卷积神经网络简介 4.对抗样本和对抗攻击 4.1.1 对抗扰动范围 4.1.2 对抗扰动的可见性 4.1.3 对抗扰动的测量 4.2 对抗攻击的分类 4.2.1 攻击者的影响力 4.2.2 攻击者的知识 4.2.3 安全入侵 4.2.4 攻击的特异性 4.2.5 攻击方法 5.2 防御…

对抗学习DCGAN网络

文章目录 DCGAN教程1. 简介2. 生成对抗网络(Generative Adversarial Networks)2.1 什么是 GAN2.2 什么是 DCGAN 3. DCGAN实现过程3.1 输入3.2 数据3.3 实现3.3.1 权重初始化3.3.2 生成器3.3.3 判别器3.3.4 损失函数和优化器3.3.4 训练3.3.5 结果 DCGAN教…

NLP中的对抗学习VS对比学习-1

文章目录 1 对抗学习的目的是什么?2 embedding是什么?3 对抗训练4 常见的对抗训练方式4.1 FGM4.2 PGD4.3 FreeAT4.4 FreeLB5 对抗训练和constractive learning6 对比学习的history and achievement思维导图链接:https://www.processon.com/mindmap/64159f9ff502f062b5d616be…

深度学习对抗样本的防御方法

作者: 19届 lz 论文:《深度学习对抗样本的防御方法综述》 问题 2013年 ,Szegedy 等 人 [1]首先通过添加轻微扰动来干扰输入样本,使基于深度神经网络(Deep neural network, DNN)的图片识别系统输出攻击者想…

对抗机器学习模型

重磅推荐专栏: 《Transformers自然语言处理系列教程》 手把手带你深入实践Transformers,轻松构建属于自己的NLP智能应用! 1. Attack ML Model 随着AI时代机器学习模型在实际业务系统中愈发无处不在,模型的安全性也变得日渐重要。…

PyTorch 生成对抗网络 01.生成对抗网络

1. 简介 本教程通过一个例子来对 DCGANs 进行介绍。我们将会训练一个生成对抗网络(GAN)用于在展示了许多真正的名人的图片后产生新的名人。 这里的大部分代码来自pytorch/examples中的 dcgan 实现,本文档将对实现进行进行全面 的介绍&#x…

机器学习中火爆的对抗学习是什么,有哪些应用?

1、什么是对抗学习? 机器学习这一技术自出现之始就以优异的性能应用于各个领域。近年来,随着机器学习的快速发展与广泛应用,这一领域更是得到前所未有的蓬勃发展。 目前, 机器学习在计算机视觉、语音识别、自然语言处理等复杂任务中取得了公…