介紹
將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使我們可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志,以及支持可撤銷的操作。也稱之為:動(dòng)作(Action)模式、事物(transaction)模式
結(jié)構(gòu)
- Command抽象命令類
- ConcreteCommand具體命令類
- Invoker調(diào)用者/請(qǐng)求者
請(qǐng)求的發(fā)送者,它通過命令對(duì)象來執(zhí)行請(qǐng)求。一個(gè)調(diào)用者并不需要在設(shè)計(jì)時(shí)確定其接收者,因此它只與抽象命令類之間存在關(guān)聯(lián)。在程序運(yùn)行時(shí),將調(diào)用命令對(duì)象的execute(),間接調(diào)用接收者的相關(guān)操作。 - Receiver接收者
接收者執(zhí)行與請(qǐng)求相關(guān)的操作,具體實(shí)現(xiàn)對(duì)請(qǐng)求的業(yè)務(wù)處理。
未抽象前,實(shí)際執(zhí)行操作內(nèi)容的對(duì)象。 -
Client客戶類
在客戶類中需要?jiǎng)?chuàng)建調(diào)用者對(duì)象、具體命令類對(duì)象,在創(chuàng)建具體命令對(duì)象時(shí)指定對(duì)應(yīng)的接收者。發(fā)送和接收者之間沒有直接關(guān)系,都通過命令對(duì)象間接調(diào)用。
命令模式
package command;
public class Receiver {
public void action(){
System.out.println("Receiver.action()");
}
}
package command;
public interface Command {
// 實(shí)際項(xiàng)目中,可以根據(jù)需求設(shè)計(jì)多個(gè)不同的方法
void execute();
}
class ConcreteCommand implements Command{
private Receiver receiver; // 命令正真的執(zhí)行者
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
public void execute() {
// 可以在命令正真執(zhí)行前后,執(zhí)行相關(guān)處理
receiver.action();
}
}
package command;
public class Invoker {
private Command command; //也可以通過容器List<Command>容納多個(gè)命令對(duì)象,進(jìn)行批處理
public Invoker(Command command) {
this.command = command;
}
// 業(yè)務(wù)方法,用于調(diào)用命令類的方法
public void call(){
command.execute();
}
}
package command;
public class Client {
public static void main(String[] args) {
Command command = new ConcreteCommand(new Receiver());
Invoker invoker = new Invoker(command);
invoker.call();
}
}
開發(fā)中常見的場景
- Struts2中,action的整個(gè)調(diào)用過程中就有命令模式。
- 數(shù)據(jù)庫事物機(jī)制的底層實(shí)現(xiàn)
- 命令的撤銷和恢復(fù)
優(yōu)點(diǎn)
- 它能比較容易地設(shè)計(jì)一個(gè)命令隊(duì)列;
- 在需要的情況下,可以較容易地將命令記入日志;
- 允許接收請(qǐng)求的一方?jīng)Q定是否要否決請(qǐng)求;
- 可以容易地實(shí)現(xiàn)對(duì)請(qǐng)求的撤銷和重做;
- 由于加進(jìn)新的具體命令類不影響其他類,因此增加新的具體命令類很容易;
- 命令模式吧請(qǐng)求一個(gè)操作的對(duì)象與知道怎么執(zhí)行一個(gè)操作的對(duì)象分割開;
敏捷開發(fā)原則告訴我們,不要為代碼添加基于猜測的、實(shí)際不需要的功能。如果不清楚一個(gè)系統(tǒng)是否需要命令模式,一般就不要著急去實(shí)現(xiàn)它,事實(shí)上,在需要的時(shí)候通過重構(gòu)實(shí)現(xiàn)這個(gè)模式并不困難,只有在真正需要如撤銷/恢復(fù)操作等功能時(shí),把原來的代碼重構(gòu)為命令模式才有意義。
