前面讲了设计模式简述, 只说到了结构型模式,下面继续来说说行为型模式.
行为型(11个)
和上面结构型的分析一样,在了解各种模式之前,我需要问自己几个问题:行为是什么?它由哪几部分组成?都有哪些类型?
现行C语言国际标准ISO 9899:2011把行为定义为:程序的外部表现或动作。没什么参考价值啊!我觉得对一个行为问题的了解应该包括这几部分:行为目的、发起者、以什么方式、作用于谁、达到了什么效果。
它们必然蕴含在每一个行为型模式里面,从这几点出发,我们可以给行为分一下类。
从作用者分类:
1、 作用于自己就是内部行为:模板方法、状态、迭代、备忘录、策略、观察者
2、 作用于外部就是外部行为:职责链、命令、中介者、访问者、解释器
从这里可以看出来内部行为还是比外部行为多,为什么呢,可能还是分离的思想,各干各的事,能不协作就不要协作吧。
接下来我们看看内部行为,从目的上可以分为两种:
1、 更好的自我管理:模板方法、状态、策略
2、 为了方便和外部交流:迭代、备忘录、观察者
为什么说模板方法、状态、策略是自我管理呢?
模板方法就是放权的事,如果你是公司老总,只需要干战略和公司方向上的事就行了,具体的工作交给下面的人。
状态就是如果你今天感冒了就请假吧,好好休息;如果今天状态好,就多干点活。
策略说的就是有些活很难搞定,也不是公司的核心技术,就分出去,让别人干吧。
归纳一下自我管理的三点:什么行为要干,什么不要干,什么时候干。是不是还缺点什么,哦,对了,怎么没看见“怎么干”?那就涉及具体操作了,不是设计模式关心的事情。
接下来,我们看看为了和外部交流,设计模式都干啥了:
1、 我这里有信息,你来拿吧:迭代,备忘录
2、 主动送过去:观察者
迭代和备忘录的区别就是迭代是多个信息,方便外部顺序获取。观察者大家应该最熟悉,尤其是从事前端开发的,离不开观察者,到处是它的实例,我也不多说了。既然内部准备好了,也具备和外部交流的能力了,下一步就要把目光投向外部。
首先需要寻找“合伙人”。
1、 直接:职责链
2、 间接:中介者
职责链在直接找作用对象里面比较特殊,它不仅涉及到了找,还涉及到了找到后反悔怎么办。这里有一个例子,比如说需要找一个人办事,本来商量好了的,最后他不干了,也不能这么容易就放过他啊,不然损失谁负责阿,需要推荐一个人来接替他的工作,如果又不干了,继续推荐,直到找到肯干的人为止。
中介者就是把事情交给中介,让中介去协调、商量,省事。
找到“合伙人”之后,先沟通一下,互相明了这是一个什么事后,就可以商量怎么协作了,理论上可以有以下几种:
1、 我干我的,你干你的:
2、 我不干,你干:访问者、命令
3、 我干,你不干
第3条虽然在理论上存在,但是如果千辛万苦找来一个人,什么都不干,那还找来干什么,基于这个思考,我觉得在第3条里没有对应的设计模式是可以理解的。但是第1条可以有啊,为什么没有呢?这就是我的不对啦,不能怪设计模式。因为我在上面已经剥离内部行为了,所以看不到“我干我的“,就只剩下”你干你的“。总体上看,第1条里应该包括观察者:专心做自己的事情,然后通过观察者,外部也可以调整行为。
“我不干,你干”又分成两种情况:
1、 我指导你干:命令
2、 毛遂自荐,你主动要求干:访问者
到现在只能再次感叹,GOF设计模式的确是总结的特别好,连这么小众、非主流的方面也想到了,如果让我们自己想,我是怎么想也想不出访问者这种厚脸皮行为的。
命令就是我把怎么干都设计好了,给你一个说明书,你按照执行就行了。诸葛亮用这招比较多,比如说送你一个锦囊,遇到处理不了的事,打开锦囊,就有妙计在里面,按照执行就行了,这个锦囊就是命令。
至于访问者,为什么还要毛遂自荐呢,直接把事情拿过来做不就行了么。其实这里面还是有“我”的行为,“我”还是主导,你虽然要求干事情,但是干什么事情,还是最后由“我”来分配、决定的。
最后一个是解释器,它更像是针对特定情况的行为方案,所以不属于上面任何一种,用的也不多,具体不细讲。