《设计模式自习室》系列,顾名思义,本系列文章带你温习常见的设计模式。git
可是,在开篇中,我想要先总体的介绍下设计模式,让你们知道为何你要学习设计模式。程序员
因此这篇文章的主要内容是:github
我对设计模式的理解面试
设计模式的至高目标:解耦(高内聚低耦合)算法
设计模式的分类编程
设计模式遵循的设计原则后端
为何我写代码经常用不到设计模式?设计模式
文章会逐步更新于个人各个博客上(见文章尾部介绍),也但愿各位观众老爷可以关注个人我的公众号:后端技术漫谈,全部文章都会在上面发布,不会错过精彩好看的文章。安全
当我刚刚接触程序,最初听到“设计模式”这四个字的时候,我经常会思考一个问题,这个东西为何这么拗口。就像我当初听到“离散数学”,“具体数学”同样,有种摸不着头脑的感受。微信
带着这种疑问,我尝试看了几篇介绍设计模式的文章,它们都对设计模式进行了这样的介绍:
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、通过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
看完以后,我更加摸不着头脑了。看着什么单例模式,责任链模式的代码,感受老师历来就没提过这些,为何要把代码写成这样,好好的写完本身想要的功能不就行了嘛???
是的,设计模式,对于入门程序员来讲,确实有点空中楼阁,尤为是对于没接触过大型项目的人而言,这些代码是如此的陌生,甚至有点“故弄玄虚”。
可是,生活每每就是有这么多“可是”!当你逐渐入门了程序编写,接触到了大型的,功能复杂的,须要多人合做的代码后,再回头看设计模式,每每就有了愈来愈清晰的认识。
随着个人经验积累,再回来复习设计模式,经常有醒悟的感受。接下来就说说我对设计模式的认知:
设计模式的英文是什么?Design pattern,这是一个很是之准确的词汇,我的认为比中文翻译好太多了。
Patten中文释义:. n. 模式;图案;样品. vt. 模仿
pattern每每意味着是一种既定的准则,从它的动词能够看到,他有模仿的意思,也就是说,这样的代码设计,是一系列前人留下的经验,只要跟着这样写代码,每每可以让你的代码,更加简洁,更加健壮,更加优雅!
我以为他应该有个意译的名字,叫作:代码设计的最佳实践!
是否是很耳熟,还记得最近很火的《阿里巴巴Java开发手册》,以及经典的《Effective Java》吗?他们都是属于经验总结型的知识,目的是帮助程序员写出更优雅的代码!
若是你没听过上面的几本书,不要紧,固然,你也能够看看我以前的文章《阿里巴巴Java开发手册》阅读笔记,大概了解下他们的内容是什么样的,你就会理解我说的“他们是一个类型的”。
设计模式是一种代码设计思路,其最最本质的目的是为了解耦,延伸一点的话,还有为了可扩展性和健壮性,可是这都是创建在解耦的基础之上。
有同窗要问了,“解耦”是什么意思呢?请先看下面两个概念:
系统中A、B两个模块进行交互,若是修改了A模块,不影响模块B的工做,那么认为A是高度内聚的。
那么当B发生改变时,A模块仍然能够正常工做,那么就认为A与B是低耦合的。
因此解耦,本质上就是让不一样的代码块各司其职,互不干扰!
建立型模式将建立对象的过程进行了抽象,也能够理解为将建立对象的过程进行了封装,做为客户程序仅仅须要去使用对象,而再也不关系建立对象过程当中的逻辑。
简单工厂模式(Simple Factory):简单工厂模式不是GoF总结出来的23种设计模式之一
工厂方法模式(Factory Method)
抽象工厂模式(Abstract Factory)
建立者模式(Builder)
原型模式(Prototype)
单例模式(Singleton)
结构型模式是为解决怎样组装现有的类,设计它们的交互方式。例如:扩展性(外观、组成、代理、装饰)、封装(适配器、桥接)。由于如何设计对象的结构、继承和依赖关系会影响到后续程序的维护性、代码的健壮性、耦合性等。
外观模式/门面模式(Facade门面模式)
适配器模式(Adapter)
代理模式(Proxy)
装饰模式(Decorator)
桥梁模式/桥接模式(Bridge)
组合模式(Composite)
享元模式(Flyweight)
行为模式刻划了在程序运行时难以跟踪的复杂的控制流,进一步可分为行为类模式和行为对象模式。
行为类模式使用继承机制在类间分派行为。
行为对象模式使用对象聚合来分配行为。一些行为对象模式描述了一组对等的对象怎样相互协做以完成其中任何一个对象都没法单独完成的任务。
模板方法模式(Template Method)
观察者模式(Observer)
状态模式(State)
策略模式(Strategy)
职责链模式(Chain of Responsibility)
命令模式(Command)
访问者模式(Visitor)
调停者模式(Mediator)
备忘录模式(Memento)
迭代器模式(Iterator)
解释器模式(Interpreter)
建立型模式提供生存环境,结构型模式提供生存理由,行为型模式提供如何生存。
建立型模式为其余两种模式使用提供了环境。
结构型模式侧重于接口的使用,它作的一切工做都是对象或是类之间的交互,提供一个门。
行为型模式顾名思义,侧重于具体行为,因此概念中才会出现职责分配和算法通讯等内容。
设计模式是优雅的代码实现,因此会讲究标准的设计原则,经常使用的设计原则以下:
开闭原则:对扩展开放,对修改关闭
里氏转换原则:子类继承父类,单独彻底能够运行
依赖倒转原则:引用一个对象,若是这个对象有底层类型,直接引用底层类型
接口隔离原则:每个接口应该是一种角色
合成/聚合复用原则:新的对象应使用一些已有的对象,使之成为新对象的一部分
迪米特原则:一个对象应对其余对象有尽量少的了解
这一点,是我临时加上的,由于我以前也有这样的困惑。看了这么多设计模式,为何我平常使用中根本就不会想到去用呢?我想给出几点回答:
第一,咱们平常开发中,常常是使用框架在构造大型的项目,框架已经为咱们考虑到了太多的设计,已经让咱们开箱即用。因此咱们经常只须要CRUD(增删改查)。其实框架的源码中,使用到了很是多的设计模式,这也是为何不少大牛在推荐咱们看某某框架的源码前,经常建议咱们先看设计模式。不然看源码的时候,会很是的吃力,由于不知道为何会这样写代码。
第二,设计模式的使用每每在你的编程经验积累到必定程度后,在遇到了大量的问题后,你会想着去进行合理的代码结构设计来解决一些经常会遇到的问题,这时候,你就会慢慢的想到使用设计模式了!因此不要急,你能够先不用强行往本身的项目上放设计模式,但必定要先了解各类设计模式。
第三,若是你急着想要上手实践设计模式,那么,作一个彻底不依赖大型框架的项目吧,能够是一个工具类,能够是一个小功能脚本,只要不依赖那些复杂的框架,很快你就能发现你代码中能够应用设计模式的地方,别问我怎么知道的,快去本身造一个轮子吧!
本文归纳介绍了下设计模式究竟是个什么东西,在接下来的文章中,咱们会一个个设计模式来介绍,敬请期待!
https://github.com/CyC2018/CS-Notes/blob/master/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%20-%20%E7%94%9F%E6%88%90%E5%99%A8.md
https://github.com/jiayisheji/blog/issues/2
我是一名后端开发工程师。
主要关注后端开发,数据安全,爬虫,物联网,边缘计算等方向,欢迎交流。
微信公众号:后端技术漫谈
Github:@qqxx6661
CSDN:@Rude3Knife
知乎:@Zhendong
简书:@蛮三刀把刀
掘金:@蛮三刀把刀
Java面试知识点复习全手册
设计模式/数据结构 自习室
Leetcode/剑指offer 算法题解析
SpringBoot/SpringCloud菜鸟入门实战系列
爬虫相关技术文章
后端开发相关技术文章
逸闻趣事/好书分享/我的兴趣
若是文章对你有帮助,不妨收藏,投币,转发,在看起来~