前几天,我给大家介绍了算法和数据结构的基础知识。后来又有小伙伴私信问我:“小灰,你能不能也讲一讲设计模式的相关知识?”
没问题!对于程序员来说,设计模式也是必须要掌握的一项核心知识,我今天就来给大家重点讲一讲。
编程的痛点
那么,到底什么是设计模式呢?
在介绍这个概念之前,我先问问大家,在你们的工作当中,有没有接手过“祖传代码”?也就是老板让你维护前一任程序员写的老项目。
小灰自己做过10年的程序员,有过很多次这样的经历。这些个祖传代码,有相当一部分压根儿不知道写的是什么,注释非常少,结构也很混乱,不敢修改也不敢删除。
当初写下这些代码的前任,要么已经离职了,根本找不到人来问。
就算他还在职,能找到人,想问对方一点代码的问题,也还得看对方的脸色。
这就是祖传代码的痛苦。
设计模式是什么
我们该怎么办呢?
许多前辈程序员经过长期实践,总结出了一系列的解决方案。这些解决方案可以提高代码的可读性,增加代码的可重用性,保证代码的可扩展性。
这一系列解决方案,被人们称为设计模式,它是面向对象编程当中的各种经典套路。
设计模式是一种抽象的编程思想,并不局限于某一特定的编程语言,而是在许多语言之间相通的。比如在Java、C#、C 语言当中,都可以使用到设计模式。
但设计模式也有它的边界,它的适用范围是面向对象的编程语言。对于面向过程语言、函数式编程语言,谈论设计模式是没有意义的。
如果有人跟你说,Fortran语言当中的设计模式非常好用,或者说自己在学习Lisp语言当中的设计模式,这人一定是一个假程序员。
设计模式的分类
那么,程序员前辈们一共总结出了多少种设计模式呢?
在1995年,有四位编程界的大佬合著了一本书,书名叫做《Design Patterns: Elements of Reusable Object-Oriented Software》,翻译过来就是《设计模式:可复用面向对象软件的基础》,书里面总共收录了23种设计模式。
这本书是软件研发领域重要的里程碑,合著此书的四位作者,被业内称为GoF(Gang of Four),因此这本书也被人称为GoF设计模式。
这23种设计模式,又可以根据设计的目的,分为大大类型:
第一类:创建型模式
这一类设计模式的目的是用于创建对象。比如大家常用的工厂模式、单例模式,就属于创建型模式。
第二类:结构型模式
这一类设计模式的目的是优化不同类、对象、接口之间的结构关系。比较常用的代理模式、装饰者模式,就属于结构型模式。
第三类:行为型模式
这一类设计模式的目的是更好地实现类与类之间的交互以及算法的执行。比如策略模式、观察者模式,就属于行为型模式。
下面这张图,总结了所有23种设计模式的分类,大家可以收藏一下。
可能有的人会觉得疑惑:网上有很多程序员总是说到24种设计模式,你这里怎么只说了23种呢?
其实,这两种说法都没错,24种设计模式是在原有23种的基础上,补充了一个空对象模式,它属于行为型模式。
此外,随着编程领域的不断发展,有很多新的设计模式不断被人提出来,目前人们所用到的设计模式其实远远不止24种。
比如生产者消费者模式,发布订阅模式等等,他们都不在24种设计模式当中,但仍然非常常用。
可能有些做后台开发的朋友会问了:我们平时用到的MVC模式,是不是也属于设计模式呢?
以我个人的观点,设计模式所研究的是类与对象、接口之间的关系,解决的是某一个特定问题。
而MVC,研究的是代码模块之间的关系,并且提供的是一揽子解决方案。所以MVC属于一种架构,而不是设计模式。