乐趣区

关于设计模式:如何从分类层面深入理解设计模式

文章首发于公众号「架构师指南」及集体博客 shuyi.tech,欢送关注拜访。

学习过设计模式的都晓得,设计模式分为三大类,别离是:创立型、结构型、行为型。但为什么它们这么分呢?某个设计模式为啥就属于结构型,而不属于行为型呢?创立型、结构型、行为型它们到底有什么不同呢?明天就来聊一聊我的了解。

创立型模式

创立型模式,顾名思义就是用来创建对象的。 创立型模式蕴含的五个设计模式,别离是:

从它们的作用来看,它们全部都是创立新对象相干的模式。

工厂办法模式、形象工厂模式、建造者模式都是创立新对象,能够屏蔽创建对象的细节。原型模式是进行对象克隆,也算是新对象创立。单例模式是管制只能创立单个对象,其也蕴含了对象的创立,因而也算是创立型模式。

结构型模式

结构型模式,就是介绍如何将对象和类组装成较大的构造,并同时放弃构造的灵便和高效。结构型模式把一个个对象联合在一起,就像积木搭建起来一样,有一种结构化的感觉。 结构型模式蕴含 7 个设计模式,别离是:

适配器模式 指的是能够让不兼容的对象可能单干,通常状况是有一个适配器类实现了多个接口,从而在接口办法中写入特定逻辑去做兼容适配。这里的构造体现在对于两种对象的兼容,通过兼容将新老对象组合起来了。

桥梁模式 其实就是把固定的和变动的拆散开来,应用组合的形式去实现。将固定的放在原地不动,而变动的则抽离进来作为一个新的类,再通过组合的模式被老的类援用。这里的构造体现在旧类对新类的援用,它们之间变成了一种结构型关系。

组合模式 就是多个构造组合起来,造成一个更简单的构造。组合模式更多是一种数据结构的出现,而不能说是一种设计模式。但从狭义的设计模式定义来看,将组合模式说成是一种设计模式,也没有错。

大家会发现组合模式和桥梁模式十分像,其实这两者之间并没有太大的差异,甚至是说根本一样。桥梁模式与组合模式,其实都是基于组合这种关系,不同的对象组合起来造成更大的构造体。桥梁模式是基于组合模式的。

装璜模式 指的是应用很多其余类对原有类进行性能加强,就像美颜 APP 一样,咱们应用很多滤镜对照片进行性能加强。这一个个的滤镜就嵌套在原有的照片上,就像一个个性能加强类嵌套在原有的根底类上一样。装璜模式的结构性就体现在这种嵌套关系上,一层层的嵌套组成了一种构造。

门面模式 指的是提供一个全新的接口层,将子系统简单的接口内容屏蔽了。则像是肯德基的前台一样,帮你把所有简单的货色屏蔽了。你不须要关怀汉堡怎么做,奥尔良鸡翅怎么做。你只须要通知前台要吃什么,它就会把汉堡、鸡翅等货色做好了拿给你。

在门面模式中,咱们在应用方与子系统之间插入了一层接口层,去屏蔽简单的外部细节。就像是肯德基的前台,帮咱们屏蔽了外部食物的制作细节一样。门面模式的构造就体现在咱们插入的这一层「门面」上,它将应用方与子系统连接起来,让应用更不便了!

享元模式 指的是共享同一个元素,是一种节俭内存的设计模式,其实就相似咱们的池技术。与其余对象简单的构造相比,我都不感觉享元模式是一种设计模式,而只是一种思维而已。但如果严格地从设计模式的定义来讲的话,那其实也能够算是。

在享元模式中,咱们会新增一个类去保留元素的映射池。而这个新增的类就相当于是一个新增的对象,通过组合的模式去节俭内存的耗费。享元模式的结构性更多是通过组合的模式体现的。

代理模式 其实就是一个代理卡在买卖双方两头,做一些流程上的管制。代理模式的结构性就体现在多了一个代理类,卡在「买卖双方」两头,这种结构特征显而易见。

从下面咱们的形容来看,咱们能够晓得结构型模式很多时候,就是两者对象之间有一个对象挡在两头,例如:适配器模式、门面模式、代理模式。要不就是通过某些关系组合在一起,例如:桥梁模式、组合模式、装璜模式、享元模式。

行为型模式

要了解行为型模式,就要重点注意行为。尽管行为型模式有些点与结构型模式相似,然而其最大的特点是行为,是这个动起来的货色。

咱们举个例子:为什么中介者模式属于行为型模式,而代理模式属于结构型模式?

中介者模式听起来与代理模式很像,但中介者模式说的是做多个对象之间的协调工作,协调他们的口头!看到了吗?协调他们的口头,才是中介者模式的外围,所以说中介者模式才是行为型模式。而代理模式,则不会有那么多个对象之间简单的关系,其侧重于对被代理对象的管制。其重点不在于简单的对象关系,不在于协调多个对象的工作,而在于单个对象的管制,代理就像卡在两者两头的一个构造一样。

有些敌人要说了,那其实代理模式也有对代理对象的管制这一行为啊,为什么不能算是行为型模式呢?代理模式的确有对代理对象管制这一行为,但这里要强调的是重点这个词。这里并不是说代理模式就没有行为,而是说代理模式的行为比起结构性少,并且不是重点。而中介者模式必定也有结构性的货色,但它诞生的目标就是为了协调多个子系统的简单调用关系,协调关系才是中介者模式的重点。

行为型模式有 10 个设计模式,别离是:

责任链模式,是一个个对象组合起来的对象链。 其申请会从链头传到链尾,每个对象能够判断其是否返回或传递到下一个对象。其侧重于是否返回或传递上来,重点是在这个行为的解决。所以责任链模式才叫行为型模式。

命令模式,是把要做的事件形象起来,造成一个命令。 后续要做这个事件的时候,我间接给一个命令你就晓得我要做什么了。为什么要这么做呢?因为变动!如果咱们的命令有很多个,那么每次我批改一个命令,我就要批改收回命令和执行命令两个中央。

但实际上收回命令的动作是不会变的,变动的只是执行命令的中央。于是为了隔离变动,那么咱们将执行命令这块拆散进来。那么收回命令与执行命令怎么沟通呢?答案是通过命令!这个其实就相似于餐厅前台与后厨的沟通。餐厅前台给的做菜单就是一个命令,后厨拿到这个命令之后就去执行。

能够看到在命令模式里,其外围是拿到命令去执行,它们之间也是一个口头的概念,因而命令模式也才归属于行为型模式。

迭代器模式,其实就是实现了汇合所有元素的遍历,让你应用的时候不须要关怀它底层的数据结构。 其重点在于对汇合元素的遍历这个行为,所以归属于行为型模式。在当初基本上只存在于源码、框架中,理论工作用到的很少了。

中介者模式,后面说过了其侧重于对多个对象之间的协调。 其重点在于协调这个事件,所以其归属于行为型模式。

备忘录模式,就是在某个时候把货色记下来,防止遗记了。 在编程上,其实就是在某个时刻将对象的信息记录保留下来,从而在另一个时候能够复原。其重点在于,其实现上会有一个专门的类来帮你记录下信息,所以归属于行为型模式。

观察者模式,从其名字能够晓得有些人盯着你,须要晓得你的动向,其实就是公布订阅模式。 其重点在于察看这个动作,察看之后将这个事件传递进来,你看到这些都是一个个的动作,因而归属于行为型模式。

状态模式,就是更为不便地管制状态。 如果一个事物的状态转换比较复杂,那么能够将其状态抽离进去,独自作为一个类。这样其状态的变动就能够更好地管制,也拆散了变动。这个就是状态模式的利用。从名字来看,咱们会感觉它应该是结构型模式,即蕴含某状态嘛。但实际上,其侧重于对于状态更好地管制,所以归属于行为型模式。

策略模式,其实就是对于不同的货色,用不同的解决形式。 个别状况下,单个具体的策略就是一个类,而这些类都会实现这些策略共有的一个接口。其重点在于不同货色,不同的解决形式。重点在于解决形式的不同,所以归属于行为型模式。

模板办法模式。 这里有两个词,即:模板、办法。模板指的是一套固定的货色,其实就是固定的额算法。办法,示意这个模板是寄存在办法上的。所以叫模板办法。简略地说,模板办法其实就是父类定义了接口类的一些共有算法。子类不能扭转这个算法流程,只能做无限的扩大。所以模板办法的重点是父类管制了一整套行为流程,其外围在于有一套固定了的算法行为,所以叫行为型模式。

访问者模式。 拜访,即当你当成了外人,不想你轻易动。你要什么,我弄好之后给你(调用你的办法)。其定义的还是访问者与被访问者之间应该如何沟通的问题,所以归属于行为型模式。

总结

为什么要费尽周折从分类下来说这些设计模式呢?因为这样能更好地了解设计模式。 一个设计模式能归属于某个分类,我置信并不是偶合,必定是因为其个性是合乎这个分类的,不然不可能轻易地进行分类。

所以咱们去钻研为什么这个模式归属于这个分类,能够更好地了解这个模式的实质,使得咱们对这些设计模式有更好的了解。与此同时,咱们在钻研的过程也是深刻了解的过程,也是比照的过程,一直加深咱们的了解与认知。

但囿于集体对于常识的了解水平不同,可能我在某些模式上的了解也并不是很透彻,有些解释可能会有点牵强,甚至顾名思义。所以大家看的时候还是得批判性地读。如果有更好的解释,能够留言通知我,咱们一起深刻探讨。

退出移动版