为什么要学习设计模式?

1、提高软件的设计质量

众所周知,良好的OO设计必须具备可维护、可扩充、可维护三个特性,然而仅仅掌握OO基础:抽象、继承、多态、封装,并不足以让我们设计出良好的系统,而合理地使用设计模式,可以帮助我们提高我们的设计质量。

2、彼此沟通的共享词汇

各行各业都有一些共享词汇来替代专业词汇来方便沟通和交流。比如,需要实现的一个方法来遍历数组、集合…交给你和老王去做,做完后你俩向主管汇报,你把步骤一步步罗列,讲得口水都干了,而隔壁的老王则直接说使用了“迭代器”模式来实现,简单明了,这时候老王就比你更能得到主管的赏识了。

3、提高自身能力和竞争力

大家都知道,在软件行业设计比实现更重要,一个系统如果没有良好的设计,即使后面再多的测试,也不可能拥有一个高质量的系统,而学习设计模式可以让你跻身于“设计圈子”,逃脱于对象与类这种琐碎的事情上,帮助我们快速成长,并且在一定程度上带动我们团队去学习,而且,这些在我们面试时都是我们和核心竞争力的体现。

什么是设计模式?

很多了在学了设计模式乃至使用了很久设计模式后对设计模式的详细定义都不模糊不清。

首先,什么是模式?

模式就是在某种情境下,针对某问题的某种解决方案

这个定义有三个关键词,你可能有些疑惑的地方,别担心,我们现在逐步了解定义中所提到的情境、问题、解决方案:

情境就是应用某个模式的情况。这是我们面对问题时不断出现的情况。

问题就是你在某种情境下达到的目标,但也可以是某种情境下的约束。

解决方案就是你所追求的:一个通用的设计,用来解决约束达到目标。

理解这些可能需要花费点时间,下面有个方法可以帮助你记忆:

"如果你发现自己处于某个情境下,面对着所欲达到的目标被一群约束影响着问题,

然而,你能够应用某个设计,克服这些约束并达到该目标,将你领向某个解决方案"

现在看来,设计模式就是解决一个经常重复发生的设计问题,接下来我们结合实际举一个上班时车钥匙忘记在车里的例子来详细解释一下:

​ 问题:我要如何才能开车上班?

情境:我将钥匙锁在车里了。

解决方案:打破窗户,进去车内,启动引擎,然后开车上班。

在定义中所需要的三个关键词我们全部有了:我们有一个问题,这个问题包括去上班的目标,时间的距离约束,可能还有其他影响;我们也就具有了某个情境,也就是车钥匙拿不到;我们也有一个解决方案,让我们能够取得钥匙并解决时间和空间的约束。既然如此,那么这算是一个设计模式了吗?

答案是否定的,我们的模式必须应用于一个重复的情境中,重复地打破钥匙未免代价太大,除此之外设计模式还需要一个名字,成为开发人员之间共享的词汇。所以说我们不能简单地用三要素来描述模式,对此我们把设计模式进行了分类,将它收录进“模式类目中”来进一步描述它,接下来我们将对设计模式进行简要的分类介绍。

设计模式的分层

随着发掘的设计模式数目逐渐增多,有必要将它们分级分类,好将它们组织起来,以简化我们寻找模式的过程,并且让同一群组内的模式相互比较。广为人知的分类方法就是按照模式的目标分类,可以分为创建型行为型结构型

创建型:涉及到将对象实例化,这类模式都提供一个方法,将客户端所需要实例化的对象解耦。

行为型:只要是行为型模式,都涉及到类和对象如何交互分配职责。

结构型:结构模式可以让你把类或对象组成到更大的结构中。

具体的分类如下图所示:

创建型:单例,创建者,原型,工厂和抽象工程,共5种。

行为型:模板,访问者,观察者,命令者,状态,中介,备忘录,解释器,责任链,策略和迭代器,共11种。

结构型:装饰者,组合,代理,外观,蝇量,桥接和适配器,共7种。

怎么学习设计模式?

  1. 脚步不要过快,慢慢理解,理解越多记得就越少

    不要光看看而已。停下来,好好想想。想个每个设计模式的定义、运用、UML图、实现代码,想象别人在问你这些问题,想象你的回答。你让大脑想得越深,就越有可能学会并记住。

  2. 勤做笔记,多敲代码

    不要只是看,要学会做笔记,拿出笔来写写,画一画,建立自己的知识体系。大量研究都证实,学习过程中如果能实际动手,将改善你的学习效果。除此之外,记笔记还方便我们以后的复习。

  3. 大声说出来

    说话可以刺激大脑的另一部分。如果你想看到懂什么,或者想牢记,就要大声说出来。更好的办法是解释给别人听,在解释给别听的同时,你可能发现某些的问题,对此有新的认知。

  4. 结合自己的工作练习,设计一些东西

    将学来的知识应用到新项目中,甚至重构旧项目,反正就是尽量应用新的知识,不断踩坑,获取实践经验。或者,仅仅拿一只笔,试着应用某个设计模式来解决你遇到的某个难题。

在这章我们介绍了设计模式的作用、定义、分类、学习方式,也许文字很枯燥,但只有对设计模式有一个总括的理解我们才能更好地学习它,接下来逐个向大家介绍23种设计模式。

下一章:单例模式

设计模式从入门到放弃相关推荐

  1. 《Python从入门到放弃》(Yanlz+Unity+SteamVR+云计算+5G+AI=VR云游戏=Python+PyCharm+人工智能+无人驾驶+数据可视化+人机交互+立钻哥哥+==)

    <Python从入门到放弃> <Python从入门到放弃> 版本 作者 参与者 完成日期 备注 YanlzAI_Python_V01_1.0 严立钻 2019.09.25 ## ...

  2. AI从入门到放弃2:CNN的导火索,用MLP做图像分类识别?

    来源 | 腾讯知乎专栏 作者 | AIoys(腾讯员工,后台工程师) 项目文档和代码在此:github项目地址: https://github.com/zsysuper/AI_Notes ▌一.前言 ...

  3. AOP埋点从入门到放弃(二)

    其实人最大悲哀莫过于知道自己想要什么,却不知道怎么坚持!最近迷恋上了死侍 其实和我平时的状态差不多,以一个混子的心态去做任何事情,往往成功的概率会更大!!! 一张图片镇楼!!! 上文说到了Aspect ...

  4. 入门到放弃node系列之网络模块(二)

    为什么80%的码农都做不了架构师?>>>    前言 本文首发[一名打字员] 上一节我们刚刚介绍完node的HTTP和HTTPS模块,相信我们也对nodejs有了更深层次的理解,接下 ...

  5. webpack - vue Component 从入门到放弃(三)

    离上一篇已经一个星期了,人的拖延症是没法救的,今晚趁着蒙蒙春雨,来抒发抒发情感. 上一篇简单介绍了webpack的配置,这里稍微再做一一下延伸 插件 插件可以完成更多 loader 不能完成的功能.插 ...

  6. CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

    前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...

  7. python ** 运算符_Python从入门到放弃运算符(2)

    摘要:上一篇Python从入门到放弃-运算符(1),讲了Python的运算符中的算术运算符.赋值运算符.比较(关系)运算符,这篇继续讲Python的运算符. 逻辑运算符 逻辑运算符是对真和假两种布尔值 ...

  8. python从入门到放弃系列恶搞短片-太惨!学Python方法用错,直接从入门到放弃!...

    原标题:太惨!学Python方法用错,直接从入门到放弃! 从你开始学习编程的那一刻起,就注定了以后所要走的路-从编程学习者开始,依次经历实习生.程序员.软件工程师.架构师.CTO等职位的磨砺:当你站在 ...

  9. 为什么叫python编程-月薪上万的Python编程,为什么你还没入门就放弃了?

    "大家都是怎么学Python 的?我学了一个月,感觉自己怎么学都学不进去啊,还是一脸懵--学习前我有做过规划,现在连入门都不算,我应该怎么办啊!!!求大神给一个学习思路!求大神讲解入门要重点 ...

最新文章

  1. matlab中调用cplex 以及使用 Yalmip 工具箱
  2. J .U.C 中的原子操作类
  3. Restoring Permutation CodeForces - 1315C(思维)
  4. .NET6之MiniAPI(十三):健康检查
  5. Opencv中IplImage的四字节对齐问题
  6. 机器学习算法-Adaboost
  7. Flutter StreamBuilder 异步更新数据
  8. HTML表格修改字段,HTML表格 – 更改列中单个单元格的宽度
  9. TypeScript -脚本编程语言
  10. 随机效应估算与固定效应估算_短面板数据学习手册(固定效应与随机效应等汇总)...
  11. linux 路由配置工具下载,Linux/Openwrt路由安装配置UPNP服务提高迅雷下载速度
  12. Ubuntu 18.04 桌面美化全攻略
  13. Django model select获取数据详细讲解
  14. swift实现python中的spicy.signal.find_peaks
  15. The Elegant Manjaro——ManjaroLinux配置与美化教程
  16. C#怎么选中datagridview中的一行,并获得它的数据?
  17. 罗克韦尔Rockwell Automation EDI 项目
  18. 收藏 | 83篇文献,万字总结强化学习之路
  19. mall4j的小程序商城(java)
  20. 5分钟让免费的 Linux KVM 虚机管理跟 VMWare 一样好用

热门文章

  1. translate函数的使用
  2. 【JS】1224- ECMAScript 2022预览:10个进入Stage 4的提案
  3. 华为荣耀3C电源键失灵的解决办法(联通)
  4. SpringCloudAlibaba:Nacos
  5. Photoshop操作总结(四)
  6. gc 吞吐量和停顿时间为什么是矛盾的??
  7. js 停顿一秒_[js样式效果]具有停顿效果上下滚动方式
  8. Android vector 标签 pathData 详解
  9. uni-app 配置代理
  10. JAVA实现开根号的两种方式:二分法以及牛顿迭代法