命令模式可以將請(qǐng)求發(fā)送者和請(qǐng)求接收者完全解耦,發(fā)送者與接收者之間沒有直接引用關(guān)系,發(fā)送請(qǐng)求的對(duì)象只需要知道如何發(fā)送請(qǐng)求,而不必知道如何完成請(qǐng)求。
命令模式的定義:將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化,對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志,以及支持可撤銷的操作。
命令模式的結(jié)構(gòu)與實(shí)現(xiàn):
1.Command(抽象命令類):抽象命令類一般是一個(gè)抽象類或接口,在其中聲明了用于執(zhí)行請(qǐng)求的方法,通過這些方法可以調(diào)用請(qǐng)求接收者的相關(guān)操作。
public abstract class Command {
public abstract void execute();
}
2.ConcreteCommand(具體命令類):具體命令類是抽象命令類的子類,實(shí)現(xiàn)了在抽象命令類中聲明的方法,它對(duì)應(yīng)具體的接收者對(duì)象,將接收者對(duì)象的動(dòng)作綁定其中。
public class ConcreteCommand extends Command {
private Receiver receiver;
public ConcreteCommand() {
receiver=new Receiver();
}
@Override
public void execute() {
receiver.action();
}
}
3.Invoker(調(diào)用者):調(diào)用者即請(qǐng)求發(fā)送者,它通過命令對(duì)象來執(zhí)行請(qǐng)求。一個(gè)調(diào)用者并不需要在設(shè)計(jì)時(shí)確定其接收者,因此它只與抽象命令類之間存在關(guān)聯(lián)關(guān)系。
public class Invoker {
private Command command;
public Invoker(Command command) {
this.command=command;
}
public void setCommand(Command command) {
this.command = command;
}
public void request() {
//調(diào)用命令類中的方法
command.execute();
}
}
4.Receiver(接收者):接收者執(zhí)行與請(qǐng)求相關(guān)的操作,具體實(shí)現(xiàn)對(duì)請(qǐng)求的業(yè)務(wù)處理。
public class Receiver {
public void action() {
System.out.println("接收者調(diào)用具體業(yè)務(wù)!");
}
}
5.Test:
public class Test {
public static void main(String[] args) {
ConcreteCommand command=new ConcreteCommand();
Invoker invoker=new Invoker(command);
//接收者調(diào)用具體業(yè)務(wù)!
invoker.request();
}
}