为什么要学设计模式?

2023-11-10

01

什么是设计模式


设计模式( Design Pattern )代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长一段时间的试验和错误总结出来的。


上面的解释来自于网络,是比较标准的定义,可以从中筛选出几个关键字来帮助我们理解什么是设计模式:

  • 最佳实践

  • 解决方案

  • 试验和错误总结


从上面的三个关键词中可以总结出,设计模式就是在针对编码过程中遇到的问题总结出来的最佳解决方案。


那么这些问题指的是什么问题呢?面向对象的程序应该具有可维护性、代码可复用性、扩展性及灵活性,要解决的问题就是代码可维护性问题、复用性问题、扩展性问题及灵活性问题。


简单来说,设计模式就是指导你如何写出可维护、可复用、可扩展及灵活的代码。


02

设计模式分类


设计模式总共有 23 种,总体来说可以分为三大类:创建型模式( Creational Patterns )、结构型模式( Structural Patterns )和行为型模式( Behavioral Patterns )。

640?wx_fmt=png

上面的三种分类说明,有助于在开发时思考当前场景应该使用哪种分类。大家不一定要全部记住,有个大概的了解即可。


03

学习设计模式


1. 为什么要学设计模式

写出可维护、可复用、可扩展及灵活的代码是我们的目的,也是学习设计模式的理由,但是这个理由对我们来说太抽象,下面从 “ 读 ” 和 “ 写 ” 两方面来说明到底为什么要学习设计模式。


作为开发人员,不可避免地要接触其他人写的代码,有的是一些知名的库或框架,例如 Spring 、Shiro 等。但是当我们去阅读这些框架源码的时候会发现无从下手,因为类太多了,关系太复杂,而且很多类的命名看不懂。


比如 xxxBuilder 、xxxStrategy 、xxxFilter 等,一个词看不懂就可能导致你直接放弃继续阅读。如果没有学过设计模式,自然看不懂,学习设计模式可以有效地帮助你阅读代码,即便不能百分百帮到你,至少也能帮到百分之三四十。


每一个开发人员必然喷过其他人写的代码,觉得其他人的代码有的写得很垃圾,尤其是要扩展功能或者修改功能的时候,恨不得全部删掉重新写,其实在其他人看来你的代码也是如此。


所以写出一手让人无话可说的代码是很有必要的,不仅可以满足你的小小成就感,也可以让你的程序更快速稳定地发展。在一个项目组中,如果大家都学习过设计模式,那么当你阅读或修改同事写的代码时也将得心应手,少了很多麻烦。


2. 如何学好设计模式

如今网上和书上都有大量的设计模式教程,但是他们大部分都有一个共同点:仅仅使用生活中的例子。比如前几年我第一次学习设计模式,在学到适配器模式时,教程中抛出了一个电器的插头问题:


你家插座只有三头的,但电器插头是两头的,怎么办?弄个插头适配器将两头转换成三头。


Nice,这个例子简单明了,作为新手的我瞬间明白了适配器的含义,就是在不兼容的双方中间做一层转化。但是后来发现在实际编码中根本用不上这个设计模式,因为我不会用。


生活中的例子的确可以帮助我们理解设计模式,这是毋庸置疑的,但是想要真正用好设计模式,实际项目中的案例是必不可少的,这也是我写这门课的原因,希望通过分析实际案例,能够帮到更多想要学习设计模式的同行。


扫码试读课程

640?wx_fmt=jpeg

下面给出几点更加具体的建议:


  • 从生活例子中去理解设计模式;

  • 从实际案例去了解设计模式的使用场景;

  • 动手实践,在学完实际案例之后,不妨动手写一写,不要写生活中的例子,自己构造一个小功能,用上你的设计模式;

  • 改变自己的意识,在开发或修改一个功能时,首先要下意识地去思考这个功能将来在修改和扩展上会遇到什么问题,能否用上设计模式。

记住一定要思考、一定要思考、一定要思考,即便最终用不上,也能让你回顾一遍设计模式的内容,使其知识更牢固。很多开发者不是不会用,而是根本没有想过要用设计模式,久而久之这方面的能力自然就弱化了。


点击阅读原文,现在开始掌握设计模式!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么要学设计模式? 的相关文章

  • 手把手教你使用Python做数据分析

    以下是使用Python进行数据分析的一般步骤 1 数据获取 首先 需要获取要分析的数据 数据可以从多个来源获取 如数据库 CSV文件 API等 Python中有很多库可以帮助我们进行数据获取和处理 如pandas numpy request
  • CV应用场景

    图像分类 已经成熟 目标检测 需调研具体场景 3D目标检测 暂无场景部署 视频目标检测属 目标跟踪 分割 语义分割 实例分割 全景分割 视频目标分割 超像素分割 具体应用场景 车道线检测 压缩与NAS NAS 模型压缩 剪枝 量化 蒸馏 G
  • TortoiseGit 入门指南03:将修改提交到版本库

    你现在应该已经有了一个仓库 在工作过程中会对项目做一些修改 比如添加代码 修复错误等等 你将不定时的将这些更改 提交 commit 到代码仓库 术语 提交 是将 暂存区 内容放入 版本库 这个过程涉及到 Git 的一些基本概念 需要在这里说
  • LeetCode-169-多数元素-简单(排序/摩尔投票法/哈希表/随机数/位运算)

    一 题目 给定一个大小为 n 的数组 找到其中的多数元素 多数元素是指在数组中出现次数 大于 n 2 的元素 你可以假设数组是非空的 并且给定的数组总是存在多数元素 二 示例及提示 示例 1 输入 3 2 3 输出 3 示例 2 输入 2
  • 根据地理信息获取经纬度

    同步坐标 function synchronizationCoordinate var url http maps google com maps api geocode json address encodeURIComponent va
  • Linux vfs各种operation操作介绍

    1 ext4文件系统定义的各种操作 普通文件操作 const struct file operations ext4 file operations llseek ext4 llseek read iter generic file rea
  • MySQL——修改root密码的几种方法

    方法1 用SET PASSWORD命令 首先登录MySQL 格式 mysql gt set password for 用户名 localhost password 新密码 例子 mysql gt set password for root
  • C++ Primer Plus 第二章编程练习

    整理了我自己编写的课后题答案 如果有问题或者看不懂的欢迎大家留言 小声说 所有内容纯手打 点个赞再走呗 第二章编程练习题 Practice 1 Practice 2 Practice 3 Practice 4 Practice 5 Prac
  • mysql忘记密码及ssh连接

    mysql忘记密码 我们在安装mysql或者其他的时候会遇到忘记密码的时候 这时候就需要对密码进行重置 话不多说 直接上步骤 1 停止当前mysql服务 service mysqld stop 2 然后通过跳过权限验证启动mysql服务 m
  • 2008年7月51CTO.com十大热点文章排行榜

    刚刚过去的7月 热点新闻和精彩的技术文章还是不少的 以下是51CTO com各主要频道的精彩实用文章及简介 经典实用文章推荐 组网频道7月热点 网管人员必备的常用命令 Windows环境下有很多通过命令实现网络管理的非常有效的工具 可惜知道
  • 11-5 读写一行字符

    1 读一行字符 gets 与 gets s 都可以用做读取用户控制台输入的一行字符 gets 仅接收一个参数 char 意为读取到换行符时将读取内容全部保存到 char 中 该函数的问题在于无法判断出读取到换行符之前共有多少字符 故 cha
  • 在Repeater控件中创建可隐藏区(原作)

    在Repeater控件中创建可隐藏区 原作 最新的一篇作品 发表在天极网上 http dev yesky com SoftChannel 72342371945218048 20041227 1893718 shtml
  • Nginx 增加二级目录的反向代理时,最常见的两个问题

    当我们想在某个Nginx网站中增加一个两级目录 当然也可以是很多级 作为反向代理时 如果使用常见的单个Nginx反向代理配置的方法 非常容易遇到配置有问题的情况 主要由如下两个问题造成 1 因为不是独立配置反向代理 所以Nginx Conf
  • 数学建模论文常用LaTeX代码(2021美赛)

    数学建模论文常用LaTeX代码 图片 单图 begin figure htbp centering includegraphics width 9 textwidth XXX pdf 图片相对位置 caption xxx 图片标题 labe
  • Ts学习笔记

    any 任何类型都可以赋值给any any也可以给任何类型赋值 unknown 任何类型可以赋值给 unknown 但是 unknown 类型赋值给其它类型需要对其进行类型缩小 type 类型一般都是大写字母开头 type Fish nam
  • 敏捷开发知识体系笔记

    敏捷开发知识体系整体框架 敏捷开发工程实践 项目管理 迭代开发 风险价值生命周期 多级项目规划 完整团队 每日站立会议 任务板 燃尽图 需求管理 需求订单 业务流程草图 用例驱动开发 用户故事 架构 演进的架构 演进的设计 基于组件的架构设
  • 同步服务器安装系统,时间同步服务器的配置方法

    知道什么是时间同步服务器的配置方法吗 下面是学习啦小编跟大家分享的是时间同步服务器的配置方法 欢迎大家来阅读学习 时间同步服务器的配置方法 方法 步骤 双击任务栏右下角 时间 打开 时间和日期 属性 设置对话框 2选择 Internet时间
  • SimpleDateFormat用法详解

    SimpleDateFormat类是一个以语言环境敏感的方式来格式化和解析日期的工具类 它允许你将日期格式化为字符串 或从字符串解析为日期 格式化日期为字符串 SimpleDateFormat sdf new SimpleDateForma
  • 在linux下编译多线程需要如下设置

    编译时这样输入命令 gcc xxx c o xxx out lpthread
  • LeetCode知识点总结 - 1710

    LeetCode 1710 Maximum Units on a Truck 考点 难度 Sorting Easy 题目 You are assigned to put some amount of boxes onto one truck

随机推荐

  • Xilinx 7系FPGA LVDS使用要注意了,供电不能搞错

    最近新做了一块板子 用到Spartan 7芯片对前级视频源叠加OSD菜单 前级会将HMDI转成LVDS送给FPGA处理 在原理图设计阶段没有仔细阅读fpga手册 导致LVDS BANK供电错误 应该接2 5V 实际接3 3V 且BANK供电
  • 射频与无线技术入门 读书记录

    一 基础概念 无线系统框图 瓦特W 功率测量单位 能量 功率 时间 如100W的灯泡亮了2小时 能量就是100w 2 就是200W H的能量 波段 使用字母表示一定范围的频率 载波 载波只能使用模拟信号 在这个模拟信号上承载模拟或者数字信息
  • 跨域的解决方案

    一 跨域 1 概念 指的是浏览器不能执行其他网站的脚本 它是由浏览器的同源策略造成的 是 浏览器对javascript施加的安全限制 2 同源策略 是指协议 域名 端口都要相同 其中有一个不同都会产生跨域 3 跨域流程 二 解决跨域方案 1
  • [转载] 陈皓——程序员技术练级攻略

    PS 原文出自酷壳上的陈皓对程序员从入门到精通的攻略 让你感受一下真正的大神吧 又是阿里人 他的文章真心不错 希望对你也有用 原文地址 http coolshell cn articles 4990 html 陈皓酷壳博客地址 http c
  • oracle failover mode,Oracle RAC FailOver配置

    Oracle RAC FailOver配置 Oracle RAC主要为数据库的应用提供了HA High Available 的环境 HA体现在负载均衡 loadbalance 和容错 failover 两个方面 Oracle RAC 的Fa
  • 机器学习---期望+方差+标准差+协方差

    1 期望 在概率论和统计学中 数学期望 mathematic expectation 或均值 亦简称期望 是试验中每次可能结果的概率乘以其结果的总和 是最基本的数学特征之一 它反映随机变量平均取值的大小 大数定律表明 随着重复次数接近无穷大
  • Optimal Coin Change(完全背包计数)

    题目描述 In a 10 dollar shop everything is worthy 10 dollars or less In order to serve customers more effectively at the cas
  • Java对象序列化

    Java 对象序列化 对象序列化的目标是将对象保存到磁盘中 或允许在网络中直接传输对象 对象序列化机制允许把内存中的 java 对象转换成为与平台无关的二进制流 从而允许把这种二进制流持久保存到磁盘上 实现对象序列化 该类实现接口 seri
  • texstudio与ctex_Latex的使用(Ctex+TeXstudio)

    1 下载 CTEX Latex 本来是只支持英文的 但是实在太好用了 遂结合中国的团队以及有识之士 开发了这个 CTEX CTEX 有 TexLive TexLive 为 Latex 安装包的名字 的所有内容 还包括了中文的支持 所以这里我
  • 【C++】详解inline

    2023年8月28日 周一晚上 目录 优点 缺点 使用条件 为什么调用函数会有开销 举例说明 优点 当使用inline关键字声明一个函数时 编译器会将函数体内联到所有调用该函数的地方 这可以提高执行效率 因为无需进行函数调用的开销 缺点 但
  • android 日期控件

    相关布局文件
  • android:OKHttp的使用

    1 之前学习了两种基于http访问服务器的方法 一种是HttpURLConenction 一种是Apache下的HttpClient 说实话 这两种方法操作起来都不是很简单明了 所以当前首选的网络通信库是由Square公司开发的OKHttp
  • 有关C++,Qt中使用指针的注意事项

    1 指针一般在创建的时候都应该初始化 除非你能保证要么你不会用到这个指针 要么在你使用之前它以及被被初始化了 如果不初始化 它就是野指针 在Debug模式下 VC 编译器会把未初始化的栈内存上的指针全部填成 0xcccccccc 当字符串看
  • RUNOOB python练习题6 斐波那契数列

    用来练手的python 练习题其六 原链接 python练习实例6 题干 斐波那契数列 斐波那契数列可以说是很好的递归理解工具了 这里就用递归实现一下斐波那契数列 源代码如下 返回fibonacci数列中某一项的数值 def Fibonac
  • 【面试题】2023年最新前端面试题-react篇

    原文见 语雀 https www yuque com deepstates interview hia3k3 核心概念 元素渲染 组件 props state refs 使用场景 如何创建 如何访问 组件通信 父子 祖孙 兄弟组件通信 生命
  • 【golang/go语言】Go语言代码实践——高复用、易扩展性代码训练

    某个项目里有一段老代码写的不是很好 想着能否通过自己掌握的知识 将其改善一下 感兴趣的小伙伴可以通过了解背景和需求 自己试想下该如何实现 如果有更好的方案也欢迎留言讨论 1 背景及需求 1 背景 假设我们的下游提供了一个定时任务接口Cron
  • linux编译命令——make -j18

    项目越来越大 每次需要重新编译整个项目都是一件很浪费时间的事情 Research了一下 找到以下可以帮助提高速度的方法 总结一下 1 tmpfs 有人说在Windows下用了RAMDisk把一个项目编译时间从4 5小时减少到了5分钟 也许这
  • Browsersync的安装及使用方法

    Browsersync介绍 Browsersync是浏览器同步测试工具 Browsersync能让浏览器实时 快速响应文件更改 html js css sass less等 并自动刷新页面 省去手动F5的事件 更重要的是 Browsersy
  • 模拟电路设计(24)---几种不同类型的A/D转换器的转换原理

    A D转换器是将模拟信号变换成相应的数字信号的装置 今天来介绍几种不同类型的A D转换器的转换原理 双积分式A D转换器的转换原理 这种转换本质是一种V T 电压 时间 的转换 如下图所示 它的一次转换基本工作原理可以分成三个工作阶段 双积
  • 为什么要学设计模式?

    01 什么是设计模式 设计模式 Design Pattern 代表了最佳的实践 通常被有经验的面向对象的软件开发人员所采用 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案 这些解决方案是众多软件开发人员经过相当长一段时间的试