一、介紹
- 命令模式:將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使我們可用不同的請(qǐng)求對(duì)客戶(hù)端進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求記錄,以及支持可撤銷(xiāo)的操作。也稱(chēng)之為:動(dòng)作Action模式、事物Transaction模式
二、結(jié)構(gòu)
-
command
抽象命令類(lèi) -
ConcreteCommand
具體命令類(lèi) -
Invoker
調(diào)用者/請(qǐng)求者- 請(qǐng)求的發(fā)送者,它通過(guò)命令對(duì)象來(lái)執(zhí)行請(qǐng)求。一個(gè)調(diào)用者并不需要在設(shè)計(jì)時(shí)確定其接受者,因此它只與抽象命令之間存在關(guān)聯(lián)。在程序運(yùn)行時(shí),將調(diào)用命令對(duì)象的
execute()
,間接調(diào)用接收者的相關(guān)操作。
- 請(qǐng)求的發(fā)送者,它通過(guò)命令對(duì)象來(lái)執(zhí)行請(qǐng)求。一個(gè)調(diào)用者并不需要在設(shè)計(jì)時(shí)確定其接受者,因此它只與抽象命令之間存在關(guān)聯(lián)。在程序運(yùn)行時(shí),將調(diào)用命令對(duì)象的
-
Receiver
接收者
接收者執(zhí)行與請(qǐng)求相關(guān)的操作,具體實(shí)現(xiàn)對(duì)請(qǐng)求的業(yè)務(wù)處理。未抽象前,實(shí)際執(zhí)行操作內(nèi)容的對(duì)象 -
Client
客戶(hù)類(lèi)
在客戶(hù)類(lèi)中需要?jiǎng)?chuàng)建調(diào)用者對(duì)象、具體命令類(lèi)對(duì)象,在創(chuàng)建具體命令對(duì)象時(shí)指定對(duì)應(yīng)的接收者。發(fā)送者和接收者之間沒(méi)有直接關(guān)系,都通過(guò)命令對(duì)象間接調(diào)用。
三、實(shí)例
Receiver,java
package cn.itcast.day246.command;
//接收者
public class Receiver {
public void action(){
System.out.println("接收者執(zhí)行命令");
}
}
Command.java
package cn.itcast.day246.command;
//命令處理的中轉(zhuǎn)接口
public interface Command {
public void execute();// 這里是返回一個(gè)空,但是實(shí)際開(kāi)發(fā)中我們可以添加多個(gè)不同的方法
}
// 實(shí)際中轉(zhuǎn)類(lèi)
class ConcreteCommand implements Command {
private Receiver receiver;// 命令的真正執(zhí)行者,當(dāng)然這里也可以使用一個(gè)容器來(lái)保存多個(gè)命令的接收者
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
// 調(diào)用前的相關(guān)處理
//...
receiver.action();
// 調(diào)用前的相關(guān)處理
//...
}
}
Invoker.java
package cn.itcast.day246.command;
//命令的發(fā)起者
public class Invoker {
private Command command;// 當(dāng)然這里我們也可以使用一個(gè)容器來(lái)保存多條命令
public Invoker(Command command) {
this.command = command;
}
//業(yè)務(wù)方法,用于調(diào)用命令類(lèi)的方法
public void call() {
// 調(diào)用前的相關(guān)處理
// ...
command.execute();
// 調(diào)用后的相關(guān)處理
// ...
}
}
說(shuō)明:從上面可以看到,實(shí)際上命令處理類(lèi)實(shí)際上就相當(dāng)于一個(gè)中轉(zhuǎn)站,它從一個(gè)或者多個(gè)命令發(fā)出者(Invoker
)接收到一條或多條命令,然后分別發(fā)送到一個(gè)或多個(gè)接收者(Receiver
),當(dāng)然在接收到命令之后可以進(jìn)行相關(guān)的處理(這里可以進(jìn)行批處理),然后發(fā)送給接收者進(jìn)行處理。