命令模式可以將請求發(fā)送者和請求接收者完全解耦,發(fā)送者與接收者之間沒有直接引用關(guān)系篮愉,發(fā)送請求的對象只需要知道如何發(fā)送請求浮创,而不必知道如何完成請求。
命令模式的定義:將一個(gè)請求封裝為一個(gè)對象悬赏,從而可用不同的請求對客戶進(jìn)行參數(shù)化狡汉,對請求排隊(duì)或者記錄請求日志,以及支持可撤銷的操作闽颇。
命令模式的結(jié)構(gòu)與實(shí)現(xiàn):
1.Command(抽象命令類):抽象命令類一般是一個(gè)抽象類或接口盾戴,在其中聲明了用于執(zhí)行請求的方法,通過這些方法可以調(diào)用請求接收者的相關(guān)操作兵多。
public abstract class Command {
public abstract void execute();
}
2.ConcreteCommand(具體命令類):具體命令類是抽象命令類的子類尖啡,實(shí)現(xiàn)了在抽象命令類中聲明的方法,它對應(yīng)具體的接收者對象剩膘,將接收者對象的動(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)用者即請求發(fā)送者,它通過命令對象來執(zhí)行請求怠褐。一個(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í)行與請求相關(guān)的操作,具體實(shí)現(xiàn)對請求的業(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();
}
}