命令模式可以將請(qǐng)求發(fā)送者和接收者完全解耦简珠,發(fā)送者與接收者之間沒有直接引用關(guān)系稠诲,發(fā)送請(qǐng)求的對(duì)象只需要知道如何發(fā)送請(qǐng)求舵匾,而不必知道如何完成請(qǐng)求诬乞。命令模式的核心在于引入了命令類册赛,通過命令類來降低發(fā)送者和接收者的耦合度,請(qǐng)求發(fā)送者只需指定一個(gè)命令對(duì)象震嫉,再通過命令對(duì)象來調(diào)用請(qǐng)求接收者的處理方法森瘪。
命令模式(Command Pattern):將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而讓我們可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化票堵;對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志(命令序列化后入庫(kù))扼睬,以及支持可撤銷的操作。
????命令模式的本質(zhì)是對(duì)請(qǐng)求進(jìn)行封裝,一個(gè)請(qǐng)求對(duì)應(yīng)于一個(gè)命令窗宇,將發(fā)出命令的責(zé)任和執(zhí)行命令的責(zé)任分割開措伐。每一個(gè)命令都是一個(gè)操作:請(qǐng)求的一方發(fā)出請(qǐng)求要求執(zhí)行一個(gè)操作;接收的一方收到請(qǐng)求军俊,并執(zhí)行相應(yīng)的操作侥加。命令模式允許請(qǐng)求的一方和接收的一方獨(dú)立開來,使得請(qǐng)求的一方不必知道接收請(qǐng)求的一方的接口粪躬。
? ? ? 命令模式的關(guān)鍵在于引入了抽象命令類担败,請(qǐng)求發(fā)送者針對(duì)抽象命令類編程,只有實(shí)現(xiàn)了抽象命令類的具體命令才與請(qǐng)求接收者相關(guān)聯(lián)镰官。每一個(gè)具體命令類對(duì)應(yīng)一個(gè)請(qǐng)求的處理者(接收者)提前,通過向請(qǐng)求發(fā)送者注入不同的具體命令對(duì)象可以使得相同的發(fā)送者對(duì)應(yīng)不同的接收者,從而實(shí)現(xiàn)“將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象泳唠,用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化”狈网,客戶端只需要將具體命令對(duì)象作為參數(shù)注入請(qǐng)求發(fā)送者,無須直接操作請(qǐng)求的接收者笨腥。
命令隊(duì)列
???? 有一個(gè)請(qǐng)求發(fā)送者發(fā)送一個(gè)請(qǐng)求時(shí)拓哺,將不止一個(gè)請(qǐng)求接收者產(chǎn)生響應(yīng),這些請(qǐng)求接收者將逐個(gè)執(zhí)行業(yè)務(wù)方法扇雕,完成對(duì)請(qǐng)求的處理拓售。此時(shí)窥摄,我們可以通過命令隊(duì)列來實(shí)現(xiàn)镶奉。命令隊(duì)列最常見的實(shí)現(xiàn)方法是增加一個(gè)CommandQueue類,由該類來負(fù)責(zé)存儲(chǔ)多個(gè)命令對(duì)象崭放,而不同的命令對(duì)象可以對(duì)應(yīng)不同的請(qǐng)求接收者哨苛。
import java.util.*;
class CommandQueue {
? ? //定義一個(gè)ArrayList來存儲(chǔ)命令隊(duì)列
????private ArrayList<Command> commands = new ArrayList<Command>();
????public void addCommand(Command command) {
????????commands.add(command);
????}
????public void removeCommand(Command command) {
????????commands.remove(command);
????}
? ? //循環(huán)調(diào)用每一個(gè)命令對(duì)象的execute()方法
????public void execute() {
????????for (Object command : commands) {
????????????((Command)command).execute();
????????}
????}
}
命令隊(duì)列本質(zhì)是通過一個(gè)發(fā)起者產(chǎn)生多個(gè)命令逐個(gè)執(zhí)行來實(shí)現(xiàn)發(fā)起者一個(gè)命令被多個(gè)接收者實(shí)現(xiàn)的效果的。
宏命令
?宏命令(Macro Command)又稱為組合命令币砂,它是組合模式和命令模式聯(lián)用的產(chǎn)物建峭。宏命令是一個(gè)具體命令類,它擁有一個(gè)集合屬性决摧,在該集合中包含了對(duì)其他命令對(duì)象的引用亿蒸。通常宏命令不直接與請(qǐng)求接收者交互,而是通過它的成員來調(diào)用接收者的方法掌桩。一個(gè)宏命令的成員可以是簡(jiǎn)單命令边锁,還可以繼續(xù)是宏命令。執(zhí)行一個(gè)宏命令將觸發(fā)多個(gè)具體命令的執(zhí)行波岛,從而實(shí)現(xiàn)對(duì)命令的批處理茅坛。
個(gè)人總結(jié):當(dāng)系統(tǒng)中存在多個(gè)調(diào)用方和被調(diào)用方,且被調(diào)用方無法抽象成抽象類或公共接口時(shí)则拷,調(diào)用方無法面向抽象類或接口編程贡蓖,直接調(diào)用接口會(huì)直接關(guān)聯(lián)被調(diào)用方(強(qiáng)耦合)曹鸠,不利于擴(kuò)展和修改,因此引入了一層命令類在調(diào)用方和被調(diào)用方之間斥铺,把被一個(gè)被調(diào)用的接口都封裝成一個(gè)具體命令類彻桃,而調(diào)用方只面向抽象命令層編程,將調(diào)用方和被調(diào)用方解耦晾蜘。
————————————————
版權(quán)聲明:本文為CSDN博主「LoveLion」的原創(chuàng)文章叛薯,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明笙纤。
原文鏈接:https://blog.csdn.net/lovelion/article/details/8796736