什么是设计模式?

设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。

设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

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

  • 最佳实践

  • 解决方案

  • 试验和错误总结

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

那么这些问题指的是什么问题呢?

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

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

设计模式分类

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

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

为什么要学设计模式?

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

作为开发人员,不可避免的要接触其他人写的代码,有的是一些知名的库或框架,例如 Spring、Shiro 等。

但是当我们去阅读这些框架源码的时候会发现无从下手,因为类太多了,关系太复杂,而且很多类的命名看不懂,比如 xxxBuilder、xxxStrategy、xxxFilter 等,一个词看不懂就可能导致你直接放弃继续阅读。

如果没有学过设计模式,自然看不懂,学习设计模式可以有效的帮助你阅读代码,即便不能百分百帮到你,至少也能帮到百分之三四十。

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

所以写出一手让人无话可说的代码是很有必要的,不仅可以满足你的小小成就感,也可以让你的程序更快速稳定的发展。

在一个项目组中,如果大家都学习过设计模式,那么当你阅读或修改同事写的代码时也将得心应手,少了很多麻烦。

如何着手学设计模式?

现如今网上和书上都有大量的设计模式的教程,但是他们大部分都有一个共同点:仅仅使用生活中的例子。

比如前几年我第一次学习设计模式,在学到适配器模式时,教程中抛出了一个电器的插头问题:

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

Nice,这个例子简单明了,作为新手的我瞬间明白了适配器的含义,就是在不兼容的双方中间做一层转化。

但是后来发现在实际编码中根本用不上这个设计模式,因为我根本不会用。

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

本课程每一篇文章主要包含三大部分:

  • 解释和理解设计模式;

  • 至少介绍一个实际案例(实际案例有些是我自己写的,有些来自于已有的框架或库);

  • 设计模式优缺点。

必要准备

本课程将使用 Java 语言讲解设计模式,虽然设计模式与语言本身无关,但是本课程中有许多实际案例都是来自于知名的 Java 框架源码,如果没有 Java 基础,学习效果可能不佳。

除了要求 Java 基础之外,还需要了解 UML 图,如果不了解 UML,只需要知道以下几种 UML 关系即可:

  • 泛化:可以简单的理解为继承关系;

  • 实现:一般是接口和实现类之间的关系;

  • 关联:一种拥有关系,比如老师类中有学生列表,那么老师类和学生类就是拥有关系;

  • 聚合:整体与部分的关系,但是整体和部分是可以分离而独立存在的,如汽车类和轮胎类;

  • 组合:整体与部分的关系,但是二者不可分离,分离了就没有意义了,例如,公司类和部门类,没有公司就没有部门;

  • 依赖:一种使用关系,例如创建 A 类必须要有 B 类。

参考下图:

用碎片时间

拉开技术差距

>> GitChat <<

全场课程、极客书 5 折起,充值会员就送背包,还有机会得机械键盘。

限时10.22 - 10.26

学了那么多年设计模式依然不会用!那可真蠢!相关推荐

  1. 讲故事,学(AHK)设计模式—观察者模式

    讲故事,学(AHK)设计模式-观察者模式 对象间的联动--观察者模式 观察者模式概述 观察者模式定义 讲故事,学设计模式 AutoHotkey代码 C++代码 JAVA代码 观察者模式总结 主要优点 ...

  2. 从零开始学Java编程语言 方法得当依然能学好

    信息科技必将是未来的潮流,Java语言必将在时代的进步中发挥不可估量的作用.作为一名初学者,掌握好一门实用而且有良好应用前景的技术是十分有必要的.多年Java教育经验事实表明,底子差,没有基础的专科生 ...

  3. 学了23种设计模式,这一篇就够了

    设计模式 1.模板方法模式 2.代理模式 3.装饰器模式 4.策略模式 5.状态模式 6.责任链模式 7.适配器模式 8.观察者模式 9.外观模式 11.组合模式 12.工厂模式 13.抽象工厂模式 ...

  4. 学python可以做什么职业好-学了那么多年python到底可以找什么工作?

    从2016年开始,python开发语言就成为了互联网行业的一个新星,越来越多的人开始学习python,甚至到现在小学,中学,大学都已经将python设置成为必修的课程.因为Python有极其简单的说明 ...

  5. 设计模式--依然创建者

    读HeadFirst的工厂有一下几条小感悟,这几条是我之前看书时记录下来的,这次又复习了下.其实创建类型的模式的主要作用在于集中创建对象,用时调用所需,以及在相似类型的对象创建的便捷性提供了帮助. 其 ...

  6. python可以做什么工作-学了那么多年python到底可以找什么工作?

    从2016年开始,python开发语言就成为了互联网行业的一个新星,越来越多的人开始学习python,甚至到现在小学,中学,大学都已经将python设置成为必修的课程.因为Python有极其简单的说明 ...

  7. 今 天看到我十年前的一篇技术文章,想到不知不觉学编程十多年了,,

    以下我在163博客十多年前发表一篇文章,那时我还做网管,,,现在看到了,当时为什么不开始努力学py 呢   搞什么网管   哈 资料  私人日志 2006-07-01 22:16:58|  分类: 记 ...

  8. 学信息安全买计算机,大学学习计算机类信息安全方向真的很蠢吗?

    大学学习计算机类信息安全方向真的很蠢吗? 本人2018届高考党,目前水平可以上一个不错的211,望借自主招生冲击985院校. 几天前,当我对老师说:"我目前最优先的选择是计算机-信息安全方向 ...

  9. 高压之下依然能高效发挥才是真本事

    去年虽然忙,但改变了生活习惯,压缩了娱乐时间,仍然可以开通简书和微信公众号并定期更新.这三个多月,工作一下子上了强度,确确实实感受到了压力,让人窒息的压力.大脑的运算速度常常跟不上工作节奏,高速运转到 ...

最新文章

  1. iscroll5制作上下拉刷新 tab出现的问题
  2. 如何在SQL Server数据库中加密数据
  3. 极通ewebs应用虚拟化系统v6.2完美上市
  4. 关于在Mac上启动了模拟器/连接了手机之后。adb device一直提示List of devices attached的问题...
  5. 微信小程序轮播图实现
  6. 动手学深度学习讲义批量下载
  7. ART模式下dex2oat出错导致系统无法正常启动
  8. 类似组卷网实现快速组卷功能,实现试题,试卷,课件快速录入、搜索、分类查询,支持mathtype和latex2word。
  9. PHP入门-运算符与操作符
  10. python数独游戏
  11. Linux Ubuntu系统fwknop单包授权认证(SPA)流程
  12. [poj3130][半平面交]How I Mathematician Wonder What You Are!
  13. Description 给出一个N*N的二维数组,求出其中的最大数和其所在的行号、列号(均从0开始计算)。 Input 第1行是一个正整数N(2≤N≤10),表示二维数组的大小。后跟N行,每行N个数。
  14. linux抓包pppoe,pppoe抓包流程和拨号流程
  15. 任正非最新签发:鼓励来华为“胡说八道”
  16. Java SE,Java EE
  17. mysql原理、索引、优化-【公司内部培训】
  18. BFC是什么?简单易懂,个人总结,一篇文章让你理解掌握BFC
  19. tableau制作人口金字塔图/旋风图
  20. 2022年全球与中国半导体NOR闪存芯片市场现状及未来发展趋势

热门文章

  1. php程序里的configini_php中配置文件操作 如config.php文件的读取修改等操作
  2. 模板 — 高精度计算
  3. smack连接远程openfire连接超时-No response received within reply timeout. Timeout was 5000ms (~5s).
  4. 例题5-8 Unixls命令(Unix ls,UVa400)
  5. wincc里c语言long int,WinCC V7.3_C脚本手册.pdf
  6. php语言出现弹框 再提交怎么写,jquery/php和多语言确认/警报框
  7. jpg怎么合成一份_哪些超实用的有机化学知识点---之有机合成工具包
  8. Linux命令行笔记
  9. 使用复合索引代替单键索引,来避免单键有null值的情况
  10. js同步获取文本框textarea输入的内容