目錄
1.簡介
將一個請求封裝成一個對象,從而可以使用不同的請求把客戶端參數化,對於請求排隊或者記錄請求日誌,可以提供撤銷和恢復功能。其中大概會有以下幾個角色,Receive,Command,Invoker。其中Reveiver可以有多個,每個Reveiver都有自己業務需要處理;Command爲整個命令模式的核心,其中涉及到對那個Receiver的命令處理,也可以有多個;Invoker就是調用者,接收命令,執行命令。
2.優點
實現類間解耦,Reveiver和Invoker之間沒有任何依賴關係,Comand的子類具有高擴展性,可結合責任鏈實現命令族解析,結合模板減少Command子類膨脹的問題。
3.缺點
當Commond子類過多,會造成類膨脹的問題。
4.形式
抽象Receiver
public abstract class AReceiver {
public abstract void method();
}
具體Receiver1
public class Receiver1 extends AReceiver {
public void method() {
System.out.println("Receiver1的業務處理");
}
}
具體Receiver2
public class Receiver2 extends AReceiver {
public void method() {
System.out.println("Receiver2的業務處理");
}
}
抽象Command
public abstract class ACommand {
public abstract void execute();
}
具體Command1
public class Command1 extends ACommand {
private AReceiver receiver;
public Command1(AReceiver _receiver) {
this.receiver = _receiver;
}
public void execute() {
System.out.println("調用receiver處理業務");
this.receiver.method();
}
}
具體Command2
public class Command2 extends ACommand {
private AReceiver receiver;
public Command2(AReceiver _receiver) {
this.receiver = _receiver;
}
public void execute() {
System.out.println("調用receiver處理業務");
this.receiver.method();
}
}
Invoker調用者
public class Invoker {
private ACommand command;
public void setCommand(ACommand command) {
System.out.println("設置需要執行的命令");
this.command = _command;
}
public void action() {
System.out.println("執行命令");
this.command.execute();
}
}
測試類
public class Test {
public static void main(String[] args) {
Invoker invoker = new Invoker();
AReceiver receiver = new Receiver1();
ACommand command = new Command1(receiver);
invoker.setCommand(command);
invoker.action();
}
}
5.擴展
下錯了命令,想反悔怎麼辦?沒有月關寶盒,沒有穿越,沒有後悔藥,只好回滾了,我滾...
抽象Receiver
public abstract class AReceiver {
public abstract void method();
public void rollBack() {
System.out.println("菠蘿菠蘿蜜");
}
}