序
前陣子在做一個(gè)東西時(shí),用到了命令模式的變種畏腕,當(dāng)時(shí)有些細(xì)節(jié)記不清了,于是去網(wǎng)上找了一些資料茉稠,結(jié)果越看越迷糊描馅。最后索性自己重新推導(dǎo)了一次,在對(duì)推導(dǎo)過(guò)程作記錄后而线,就有了這篇文章铭污。
問(wèn)題
使用word時(shí),如果做錯(cuò)了某步操作吞获,我們可以進(jìn)行”撤銷(xiāo)”,恢復(fù)到操作之前的狀態(tài)况凉。盡管每種操作都不一樣,但是卻神奇地能用同樣的方式“撤銷(xiāo)”各拷。這是怎么做到的呢刁绒?
解決方案
從上面的描述,我們可以知道烤黍,word能做到這些功能:
- 以同樣的方式表示所有可以撤銷(xiāo)的操作
- 記錄所有可以撤銷(xiāo)的操作
由此知市,可以得到以下結(jié)構(gòu):
仔細(xì)看看,好像有個(gè)問(wèn)題: 命令的定義應(yīng)該是通用的速蕊,如輸入一段文字嫂丙,但是我們撤消的是在某個(gè)地方輸入的一段文字,所以還要加上命令執(zhí)行的上下文规哲,這里我們用Receiver來(lái)指代跟啤。更新后的類(lèi)圖:
模式的理解
要理解命令模式,除了從它的應(yīng)用場(chǎng)景推導(dǎo)之外,也可以從它的定義幫助理解:
命令一般應(yīng)用于政府機(jī)構(gòu)中隅肥。當(dāng)某政府首腦發(fā)出命令時(shí)竿奏,一般不會(huì)由該首腦直接面對(duì)執(zhí)行的人,而是通過(guò)類(lèi)似國(guó)務(wù)院等機(jī)構(gòu)發(fā)出腥放。這里的國(guó)務(wù)院等機(jī)構(gòu)就是命令模式里的Invoker泛啸,負(fù)責(zé)記錄和執(zhí)行。
命令里秃症,一般會(huì)說(shuō)清楚候址,要誰(shuí)來(lái)做什么,所以种柑,事實(shí)上命令(這里的命令不同于上面類(lèi)圖里的command)是由receiver和command兩部分組成岗仑。
每過(guò)一段時(shí)間,都有人事上的一些變動(dòng)莹规,為第一次人事變動(dòng)赔蒲,都創(chuàng)建一種命令模板是不可能的,于是良漱,政府對(duì)于主要的命令都規(guī)則了一個(gè)模板舞虱,每次需要的時(shí)間,只要把對(duì)應(yīng)的人和職位變動(dòng)內(nèi)容填上去就可以了母市,這就是我們的command矾兜。
命令模式的類(lèi)圖
這部分網(wǎng)上的資料很多,我就不重復(fù)寫(xiě)了患久,以下內(nèi)容摘自博客
適合場(chǎng)景與優(yōu)缺點(diǎn)
命令模式有以下優(yōu)點(diǎn):
- 命令和實(shí)際的執(zhí)行者分離椅寺,實(shí)際的操作都是通過(guò)invoker以及receiver去執(zhí)行的
- 屏蔽了底層的復(fù)雜實(shí)現(xiàn),對(duì)外提供了統(tǒng)一的表現(xiàn)
- 可以記錄操作的歷史記錄
- 拓展性好蒋失,一方面返帕,可以很方便地添加新的命令,如在word中添加插入html功能篙挽;另一方面荆萤,也可以把命令遷移到另一種場(chǎng)景下,如把word中的命令遷移到excel中
- 用戶(hù)使用上铣卡,用戶(hù)通過(guò)組合一些命令链韭,可以實(shí)現(xiàn)宏的功能,效率更高
缺點(diǎn):
- 代碼冗余較多煮落。每個(gè)命令敞峭,需要同時(shí)修改好幾個(gè)地方,維護(hù)較復(fù)雜
由其優(yōu)缺點(diǎn)蝉仇,可以得出其適用場(chǎng)景:
- 編輯軟件旋讹,如word,excel中殖蚕,但是由于撤銷(xiāo)依賴(lài)于當(dāng)前狀態(tài),所以如果應(yīng)用的狀態(tài)無(wú)法完整保存骗村,那么不應(yīng)該提供撤銷(xiāo)功能
- 由第一點(diǎn)嫌褪,可以用于workflow、oa系統(tǒng)等軟件中胚股,用于定義流程、功能節(jié)點(diǎn)
- 由第三點(diǎn)裙秋,可以用于需要審計(jì)的系統(tǒng)中琅拌,用于審計(jì)
- shell中,用于對(duì)資源進(jìn)行封裝
- 第五點(diǎn)在很多文本編輯器中都有體現(xiàn)
不適用的場(chǎng)景:
- 功能足夠簡(jiǎn)單摘刑。如果功能本身比較簡(jiǎn)單进宝,則不建議引入命令模式,它會(huì)帶來(lái)更多的復(fù)雜性枷恕,以及更高的開(kāi)發(fā)成本
- 命令的意義不清晰或經(jīng)常變化党晋。命令模式在解耦命令的發(fā)出者與執(zhí)行者的同時(shí),也讓命令發(fā)出者與執(zhí)行者的聯(lián)系不那么清晰徐块,如果修改了命令的意義未玻,要全面修改命令的調(diào)用者,會(huì)比較難