一直覺得命令模式和策略模式很像遭顶,實(shí)際寫出來(lái)的代碼甚至有時(shí)候很難分出來(lái)是命令模式和策略模式。然后在網(wǎng)上查了一下牛柒,果然不是只有我這么想堪簿。
- 策略模式:定義算法族,分別封裝起來(lái)皮壁,讓他們之間可以互相替換椭更,此模式讓算法的變化獨(dú)立于使用算法的客戶。
- 命令模式:將請(qǐng)求封裝成對(duì)象蛾魄,這可以讓你使用不同的請(qǐng)求虑瀑、隊(duì)列,或者日志請(qǐng)求來(lái)參數(shù)化其他對(duì)象滴须。命令模式也可以支持撤銷操作舌狗。
表面看兩者的定義,似乎很不一樣扔水。
但是痛侍,如果從策略模式的定義往命令模式上套:命令模式的“命令”當(dāng)然可以理解為封裝起來(lái)的算法;
從命令模式的定義往策略模式上套:不同算法铭污,當(dāng)然是不同命令恋日;算法其實(shí)也可以支持撤銷操作。還是以《Head First 設(shè)計(jì)模式》的例子嘹狞,鴨子的“飛行”是一個(gè)算法族岂膳,那么這個(gè)算法族里面,我當(dāng)然可以添加“著陸”算法磅网,這不就是“飛行”的撤銷嗎谈截?
我個(gè)人的見解,兩者的區(qū)別在于:
策略模式要解決的問題是給鴨子增加不同的飛行算法涧偷,重點(diǎn)是鴨子簸喂;而命令模式要解決的問題,是有一系列命令要執(zhí)行燎潮,并且要解耦喻鳄。
所以,策略模式可能有不同的算法确封,但是實(shí)際工作中除呵,可能在同一環(huán)境下只執(zhí)行一種算法再菊;命令模式可能有不同的命令,實(shí)際工作中颜曾,可能各個(gè)命令是要先后執(zhí)行的纠拔。
至于什么是算法,什么是命令泛豪,其實(shí)實(shí)際代碼中有時(shí)候很難區(qū)分稠诲,并不是那么典型。
在實(shí)際使用中诡曙,主要還是看代碼的設(shè)計(jì)需要解決什么問題臀叙。有時(shí)候設(shè)計(jì)模式不是那么明確,也沒必要非得往上面套岗仑,還是切合自己的實(shí)際最重要匹耕,不要太糾結(jié)到底使用的是什么設(shè)計(jì)模式。實(shí)在糾結(jié)的話荠雕,多寫一些注釋可能更有幫助稳其。
再想遠(yuǎn)一點(diǎn),假設(shè)是老鷹炸卑,飛的時(shí)候要按照一套算法完成:一飛沖天既鞠、翱翔、盤旋盖文,假設(shè)這分別是3種飛行算法嘱蛋,那么這算什么模式?
我覺得五续,對(duì)老鷹來(lái)說(shuō)洒敏,這就是策略模式;對(duì)飛行算法來(lái)說(shuō)疙驾,可能是命令模式凶伙。
當(dāng)然,也可以把一飛沖天它碎、翱翔函荣、盤旋組合成一種飛行算法,然后設(shè)置給老鷹扳肛。那么傻挂,這個(gè)組合,是什么模式挖息?根據(jù)實(shí)現(xiàn)方式金拒,我覺得可能是外觀(老鷹飛行接口與一飛沖天等算法接口不一致,內(nèi)部依次調(diào)用一飛沖天套腹、翱翔殖蚕、盤旋)轿衔,也可能是裝飾者(老鷹飛行接口與一飛沖天等接口一直沉迹,以裝飾者實(shí)現(xiàn)一飛沖天睦疫、翱翔、盤旋)鞭呕。
對(duì)了蛤育,從命令模式的角度,這種組合命令葫松,可能應(yīng)該叫“宏命令”瓦糕。(此處扮鬼臉)