前言
在日常生活中,我們使用電腦,手機等數碼產品。往往有開機,關機的行為。對于電腦,通常我們按開機鍵開機,而在系統菜單中點擊關機命令關機。而手機也是類似。我們作為數碼產品的使用者,并不知道開機,關機命令的具體執行邏輯,手機和電腦已經把開關機的具體邏輯和細節封裝成了兩個簡單的操作。我們只需要簡單的執行開關機命令即可。而這就是命令模式在生活中的應用,同樣,在軟件程序設計中,命令模式也有各種應用。
是什么
命令模式(Command Pattern):將一個請求封裝為一個對象,從而讓我們可用不同的請求對客戶進行參數化;對請求排隊或者記錄請求日志,以及支持可撤銷的操作。命令模式是一種對象行為型模式,其別名為動作(Action)模式或事務(Transaction)模式。
如下,是命令模式的結構圖,其中
- Command 抽象命令類,一般是抽象類或者接口哦,在其中聲明了用于執行請求的
excute()
方法。 - ConcreteCommand 具體命令類,實現抽象命令類中聲明的方法。
- Invoker 表示調用者,也就是請求的發送者,通過命令對象執行請求。
- Receiver 命令的接收者,具體實現對命令請求的業務處理。
命令模式結構圖
為什么
簡單來說,就是為了解耦。設計模式在創建之初就是為了滿足軟件開發的靈活性。命令模式的初衷就是將命令調用者和命令接收者解耦開。
怎么做
下面通過幾段Java代碼來簡單了解下命令模式的具體實現:
抽象命令類
public interface Command {
void execute();
}
具體命令類
public class ConcreteCommand implements Command {
//接收者
private Receiver receiver;
public ConcreteCommand(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute() {
System.out.println("命令:"+getClass().getSimpleName()+"已經交給接收者:"+this.receiver.toString()+"執行了!");
receiver.action();
}
}
接收者類
public class Receiver {
public void action(){
System.out.println("接收者"+this.toString()+"的具體業務操作");
}
}
調用者類
/**
* 調用者/請求發送者
*/
public class Invoker {
private Command command;
public Invoker(Command command){
this.command = command;
}
public void setCommand(Command command) {
this.command = command;
}
public void call(){
System.out.println("調用者調用"+command.toString()+"命令!");
command.execute();
}
}
具體的客戶端調用
public class Client {
public static void main(String[]args){
//命令的接收者
Receiver receiver = new Receiver();
//具體命令
Command command = new ConcreteCommand(receiver);
//調用者
Invoker invoker = new Invoker(command);
//調用命令
invoker.call();
}
}
運行結果:
運行結果