本文參考:http://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/command.html
一扣蜻、模式動(dòng)機(jī)
在軟件設(shè)計(jì)中,我們經(jīng)常需要向某些對(duì)象發(fā)送請(qǐng)求颤霎,但是并不知道請(qǐng)求的接收者是誰看杭,也不知道被請(qǐng)求的操作是哪個(gè)赫编,我們只需在程序運(yùn)行時(shí)指定具體的請(qǐng)求接收者即可巷帝,此時(shí)叨咖,可以使用命令模式來進(jìn)行設(shè)計(jì)像啼,使得請(qǐng)求發(fā)送者與請(qǐng)求接收者消除彼此之間的耦合,讓對(duì)象之間的調(diào)用關(guān)系更加靈活蒲拉。
命令模式可以對(duì)發(fā)送者和接收者完全解耦肃拜,發(fā)送者與接收者之間沒有直接引用關(guān)系,發(fā)送請(qǐng)求的對(duì)象只需要知道如何發(fā)送請(qǐng)求雌团,而不必知道如何完成請(qǐng)求燃领。這就是命令模式的模式動(dòng)機(jī)。
二锦援、模式定義
命令模式(Command Pattern):將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象猛蔽,從而使我們可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志灵寺,以及支持可撤銷的操作曼库。命令模式是一種對(duì)象行為型模式,其別名為動(dòng)作(Action)模式或事務(wù)(Transaction)模式略板。
三毁枯、模式結(jié)構(gòu)
命令模式包含如下角色:
- Command: 抽象命令類
- ConcreteCommand: 具體命令類
- Invoker: 調(diào)用者
- Receiver: 接收者
- Client:客戶類
四、代碼分析
public class Receiver {
public void doSomething() {
System.out.println("接受者-業(yè)務(wù)邏輯處理");
}
}
public abstract class Command {
public abstract void execute();
}
public class ConcreteCommand extends Command {
private Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.doSomething();
}
}
public class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void action() {
this.command.execute();
}
}
public class Client {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
//客戶端直接執(zhí)行具體命令方式(此方式與類圖相符)
command.execute();
//客戶端通過調(diào)用者來執(zhí)行命令
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.action();
}
}
五蚯根、模式分析
命令模式的本質(zhì)是對(duì)命令進(jìn)行封裝后众,將發(fā)出命令的責(zé)任和執(zhí)行命令的責(zé)任分割開胀糜。
- 每一個(gè)命令都是一個(gè)操作:請(qǐng)求的一方發(fā)出請(qǐng)求颅拦,要求執(zhí)行一個(gè)操作;接收的一方收到請(qǐng)求教藻,并執(zhí)行操作距帅。
- 命令模式允許請(qǐng)求的一方和接收的一方獨(dú)立開來,使得請(qǐng)求的一方不必知道接收請(qǐng)求的一方的接口括堤,更不必知道請(qǐng)求是怎么被接收碌秸,以及操作是否被執(zhí)行、何時(shí)被執(zhí)行悄窃,以及是怎么被執(zhí)行的讥电。
- 命令模式使請(qǐng)求本身成為一個(gè)對(duì)象,這個(gè)對(duì)象和其他對(duì)象一樣可以被存儲(chǔ)和傳遞轧抗。
- 命令模式的關(guān)鍵在于引入了抽象命令接口恩敌,且發(fā)送者針對(duì)抽象命令接口編程,只有實(shí)現(xiàn)了抽象命令接口的具體命令才能與接收者相關(guān)聯(lián)横媚。
六纠炮、優(yōu)點(diǎn)
命令模式的優(yōu)點(diǎn)
- 降低系統(tǒng)的耦合度月趟。
- 新的命令可以很容易地加入到系統(tǒng)中。
- 可以比較容易地設(shè)計(jì)一個(gè)命令隊(duì)列和宏命令(組合命令)恢口。
- 可以方便地實(shí)現(xiàn)對(duì)請(qǐng)求的Undo和Redo孝宗。
七、缺點(diǎn)
命令模式的缺點(diǎn)
- 使用命令模式可能會(huì)導(dǎo)致某些系統(tǒng)有過多的具體命令類耕肩。因?yàn)獒槍?duì)每一個(gè)命令都需要設(shè)計(jì)一個(gè)具體命令類因妇,因此某些系統(tǒng)可能需要大量具體命令類,這將影響命令模式的使用看疗。
八沙峻、適用環(huán)境
在以下情況下可以使用命令模式:
- 系統(tǒng)需要將請(qǐng)求調(diào)用者和請(qǐng)求接收者解耦,使得調(diào)用者和接收者不直接交互两芳。
- 系統(tǒng)需要在不同的時(shí)間指定請(qǐng)求摔寨、將請(qǐng)求排隊(duì)和執(zhí)行請(qǐng)求。
- 系統(tǒng)需要支持命令的撤銷(Undo)操作和恢復(fù)(Redo)操作怖辆。
- 系統(tǒng)需要將一組操作組合在一起是复,即支持宏命令
九、模式應(yīng)用
很多系統(tǒng)都提供了宏命令功能竖螃,如UNIX平臺(tái)下的Shell編程淑廊,可以將多條命令封裝在一個(gè)命令對(duì)象中,只需要一條簡(jiǎn)單的命令即可執(zhí)行一個(gè)命令序列特咆,這也是命令模式的應(yīng)用實(shí)例之一季惩。
十、模式擴(kuò)展
宏命令又稱為組合命令腻格,它是命令模式和組合模式聯(lián)用的產(chǎn)物画拾。
- 宏命令也是一個(gè)具體命令,不過它包含了對(duì)其他命令對(duì)象的引用菜职,在調(diào)用宏命令的execute()方法時(shí)青抛,將遞歸調(diào)用它所包含的每個(gè)成員命令的execute()方法,一個(gè)宏命令的成員對(duì)象可以是簡(jiǎn)單命令酬核,還可以繼續(xù)是宏命令蜜另。執(zhí)行一個(gè)宏命令將執(zhí)行多個(gè)具體命令,從而實(shí)現(xiàn)對(duì)命令的批處理嫡意。
十一举瑰、總結(jié)
- 在命令模式中,將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象蔬螟,從而使我們可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化此迅;對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志,以及支持可撤銷的操作。命令模式是一種對(duì)象行為型模式邮屁,其別名為動(dòng)作模式或事務(wù)模式整袁。
- 命令模式包含四個(gè)角色:抽象命令類中聲明了用于執(zhí)行請(qǐng)求的execute()等方法,通過這些方法可以調(diào)用請(qǐng)求接收者的相關(guān)操作佑吝;具體命令類是抽象命令類的子類坐昙,實(shí)現(xiàn)了在抽象命令類中聲明的方法,它對(duì)應(yīng)具體的接收者對(duì)象芋忿,將接收者對(duì)象的動(dòng)作綁定其中炸客;調(diào)用者即請(qǐng)求的發(fā)送者,又稱為請(qǐng)求者戈钢,它通過命令對(duì)象來執(zhí)行請(qǐng)求痹仙;接收者執(zhí)行與請(qǐng)求相關(guān)的操作,它具體實(shí)現(xiàn)對(duì)請(qǐng)求的業(yè)務(wù)處理殉了。
- 命令模式的本質(zhì)是對(duì)命令進(jìn)行封裝开仰,將發(fā)出命令的責(zé)任和執(zhí)行命令的責(zé)任分割開。命令模式使請(qǐng)求本身成為一個(gè)對(duì)象薪铜,這個(gè)對(duì)象和其他對(duì)象一樣可以被存儲(chǔ)和傳遞众弓。
命令模式的主要優(yōu)點(diǎn)在于降低系統(tǒng)的耦合度,增加新的命令很方便隔箍,而且可以比較容易地設(shè)計(jì)一個(gè)命令隊(duì)列和宏命令谓娃,并方便地實(shí)現(xiàn)對(duì)請(qǐng)求的撤銷和恢復(fù);其主要缺點(diǎn)在于可能會(huì)導(dǎo)致某些系統(tǒng)有過多的具體命令類蜒滩。 - 命令模式適用情況包括:需要將請(qǐng)求調(diào)用者和請(qǐng)求接收者解耦滨达,使得調(diào)用者和接收者不直接交互;需要在不同的時(shí)間指定請(qǐng)求俯艰、將請(qǐng)求排隊(duì)和執(zhí)行請(qǐng)求捡遍;需要支持命令的撤銷操作和恢復(fù)操作,需要將一組操作組合在一起蟆炊,即支持宏命令稽莉。