从大二开始写代码到现在也有四年了,在这期间一直有在听别人说设计模式,觉得会使用设计模式的人就很牛掰。在大学期间,真正系统地去学习的设计模式说实话也只有单例模式,而且说实话是为了应付面试去学习的,因为面试官可能动不动就让你手撸一个单例模式。
最近一段时间决定下定决心好好地琢磨一下设计模式,毕竟我也想当一个牛掰的人,因此就有了这一系列文章,本篇文章即是这一系列文章的第一篇文章,主要会先简单地介绍一些设计模式的相关一些概念,设计模式的种类,以及常见的设计模式有哪些之类的。
本系列文章的相关模式实现都选择使用Go语言实现
在这里先罗列一下这一系列文章的参考资料:
关于这一系列的相关介绍差不多都说完了,下面就开始进入正题吧。
设计模式正所谓它是一种设计的模式,所以先用一句话来简单概述一下模式
模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案
相信大部分人都可以很轻松地理解好这一句话,在历史的长河中,人们经常会遇到重复出现地一系列问题,前车之鉴,后车之师,前人为我们总结了针对某种特定的问题时的经验,后人在面对这样的问题时,就能更好地去解决这个问题。
举个做菜的例子,菜有很多种,不同的菜可以有相同的做法,相同的菜也可以有不同的做法,每种做法其实就像是一种模式。比如就拿大部分的绿色蔬菜来说,烧一碗绿色蔬菜的流程莫不过于以下几个步骤:
当然其中的顺序肯定每个人都有每个人的喜好,调料也有不同的放法,这都是大同小异的。姑且称上面这几个步骤为烧一碗绿色蔬菜的模式,按照这种模式基本可以烧好大部分的蔬菜,这也就是说烧绿色蔬菜这一系列的问题可以用上面这个模式解决。另外,烧红烧肉有烧红烧肉的模式,烧鱼有烧鱼的模式,这都是人们在处理大部分相同菜系的时候,采用的大同小异的模式,这是中华文明自古就流传下来的一种烧菜模式。
如果说上面讨论的烧菜模式是烧菜时候的模式,那么设计模式通俗地讲就是我们在写代码时候的模式,设计模式的一般定义如下:
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。
更通俗地一点说,设计模式就是老一辈的程序员们在写代码的时候,在特定环境下,对重复出现的一系列编程问题,总结出来的一套写代码的模式。在针对某种问题时,采用特定的设计模式实现,往往能够让写出来的代码更好看,更有效,更可靠,写代码的速度更效率。
因此,我学习设计模式的目的之一就是更快更好地写出可靠、逻辑清晰的代码。
设计模式主要分为以下几个基本要素:
这一系列后续的文章在介绍每种设计模式的时候,都会按照上面五个基本要素来分析该设计模式,只有真正了解设计模式的基本要素,了解该设计模式是什么,解决了什么样的问题,怎么解决的,这样才能真正地了解好对应的设计模式。
狭义的设计模式是指GoF在《设计模式:可复用面向对象软件的基础》一书中所介绍的23种经典设计模式,不过设计模式并不仅仅只有这23种,随着软件开发技术的发展,越来越多的新模式不断诞生并得以应用。
设计模式大致可以分为三大类:创建型模式、结构型模式、行为型模式
下面列出的这些设计模式我大致地罗列了几个参考资料中都有涉及到的设计模式,可能有些设计模式在这个参考资料中有,另一个参考资料中没有,于是我就把它们都加进来了。
创建模式就是创建对象的模式。系统在创建对象的时候,需要动态地决定怎样创建对象,创建哪些对象等等,而对调用者来说,不需要知道这些对象是如何被创建的,它们只是调用了一个创建对象的接口拿到了一个对象的实例而已。例如生成一辆车的模式,打造一个家具的模式等等,调用者不需要知道车,家具是如何被创建的,只需要调用一个接口即可。
结构模式就是多种对象之间的相互搭配/连接构成一个新的结构形态,从而满足一定目的,比如方便访问,扩展功能,对象复用,功能转换适配等等。例如建筑结构,同样是钢筋混凝土,建筑的不同结构,标示着这些建筑的不同作用,做成桥的结构目的就是过桥,做成房子的结构目的就是住人的
对象之间行为关系的一些常用套路,行为类的模式,重点用于模式对象间行为的模式,关于它们之间的相互作用,分配行为等等。
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
空对象模式(Null Object Pattern)
策略模式(Strategy Pattern)
模板模式(Template Pattern)
访问者模式(Visitor Pattern)
在Go Patterns一书中提到了更多的设计模式,这里就暂时先不列出来了,这一系列暂时分析上述三种基础的设计模式类型。后续会继续分析更多的设计模式。
关于设计模式的大致介绍就到这里了,写这一系列文章之前,我先大致地全部敲了一遍代码,了解了每个设计模式大致的实现过程,以及它们主要解决了什么问题。因此在写这一系列文章的时候,我已经是第二遍学习了。在这一遍学习中,希望以文章博客的形式记录一下每种设计模式的详情,希望能够更好地吸收每种设计模式的使用场景及实现原理。
OK,总结就到这里了,系列文章见。