命令模式:將一個(gè)請(qǐng)求封裝成一個(gè)對(duì)象,從而讓你使用不同的請(qǐng)求把客戶端參數(shù)化,對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志,可以提供命令的撤銷(xiāo)和恢復(fù)功能。


Command:定義命令的統(tǒng)一接口。

ConcreteCommand:Command接口的實(shí)現(xiàn)者,用來(lái)執(zhí)行具體的命令,某些情況下可以直接用來(lái)充當(dāng)Receiver。

Invoker:命令的請(qǐng)求者,是命令模式中最重要的角色。這個(gè)角色用來(lái)對(duì)各個(gè)命令進(jìn)行控制。

Receiver:命令的實(shí)際執(zhí)行者。
適用場(chǎng)景:1. 命令的發(fā)送者和命令執(zhí)行者有不同的生命周期。命令發(fā)送了并不是立即執(zhí)行。
2. 命令需要進(jìn)行各種管理邏輯。
3. 需要支持撤消\重做操作(這種狀況的代碼大家可以上網(wǎng)搜索下,有很多,這里不進(jìn)行詳細(xì)解讀)。
命令模式的優(yōu)缺點(diǎn):1、首先,命令模式的封裝性很好:每個(gè)命令都被封裝起來(lái),對(duì)于客戶端來(lái)說(shuō),需要什么功能就去調(diào)用相應(yīng)的命令,而無(wú)需知道命令具體是怎么執(zhí)行的。比如有一組文件操作的命令:新建文件、復(fù)制文件、刪除文件。如果把這三個(gè)操作都封裝成一個(gè)命令類(lèi),客戶端只需要知道有這三個(gè)命令類(lèi)即可,至于命令類(lèi)中封裝好的邏輯,客戶端則無(wú)需知道。
2、其次,命令模式的擴(kuò)展性很好,在命令模式中,在接收者類(lèi)中一般會(huì)對(duì)操作進(jìn)行最基本的封裝,命令類(lèi)則通過(guò)對(duì)這些基本的操作進(jìn)行二次封裝,當(dāng)增加新命令的時(shí)候,對(duì)命令類(lèi)的編寫(xiě)一般不是從零開(kāi)始的,有大量的接收者類(lèi)可供調(diào)用,也有大量的命令類(lèi)可供調(diào)用,代碼的復(fù)用性很好。比如,文件的操作中,我們需要增加一個(gè)剪切文件的命令,則只需要把復(fù)制文件和刪除文件這兩個(gè)命令組合一下就行了,非常方便。
3、最后命令模式的缺點(diǎn),那就是命令如果很多,開(kāi)發(fā)起來(lái)就要頭疼了。特別是很多簡(jiǎn)單的命令,實(shí)現(xiàn)起來(lái)就幾行代碼的事,而使用命令模式的話,不用管命令多簡(jiǎn)單,都需要寫(xiě)一個(gè)命令類(lèi)來(lái)封裝。