用途
命令模式是一種行為型模式。
結構
圖-命令模式結構圖
Command : 用來聲明執行操作的接口。
abstract
class Command {
protected Receiver receiver;
public Command(Receiver receiver) {
this.receiver = receiver;
}
public abstract void Execute();
}
protected Receiver receiver;
public Command(Receiver receiver) {
this.receiver = receiver;
}
public abstract void Execute();
}
ConcreteCommand : 將一個接收者對象綁定一個動作,調用接收者相應的操作,以實現Execute。
class ConcreteCommand
extends Command {
public ConcreteCommand(Receiver receiver) {
super(receiver);
}
@Override
public void Execute() {
receiver.Action();
}
}
public ConcreteCommand(Receiver receiver) {
super(receiver);
}
@Override
public void Execute() {
receiver.Action();
}
}
Invoker : 要求該命令執行這個請求。
class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void ExecuteCommand() {
command.Execute();
}
}
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void ExecuteCommand() {
command.Execute();
}
}
Receiver : 知道如何實施與執行一個與請求相關的操作,任何類都可能作為一個接收者。
class Receiver {
public void Action() {
System.out.println("執行請求");
}
}
public void Action() {
System.out.println("執行請求");
}
}
Client : 創建一個具體命令對象並設定它的接受者。
public
class CommandPattern {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command cmd = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(cmd);
invoker.ExecuteCommand();
}
}
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command cmd = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(cmd);
invoker.ExecuteCommand();
}
}
交互
圖-命令模式交互圖
1、Client 創建一個 ConcreteCommand 對象並指定他的 Receiver 對象。
2、某個 Invoker 對象存儲該 ConcreteCommand 對象。
3、該 Invoker 通過調用 Command 對象的 Execute 操作來提交一個請求。若該命令是可撤銷的,ConcreteCommand 就在執行 Execute 操作之前存儲當前狀態以用於取消該命令。
4、ConcreteCommand 對象對調用它的 Receiver 的一些操作以執行該請求。
2、某個 Invoker 對象存儲該 ConcreteCommand 對象。
3、該 Invoker 通過調用 Command 對象的 Execute 操作來提交一個請求。若該命令是可撤銷的,ConcreteCommand 就在執行 Execute 操作之前存儲當前狀態以用於取消該命令。
4、ConcreteCommand 對象對調用它的 Receiver 的一些操作以執行該請求。
要點
1、命令模式的本質是對命令進行封裝,將發出命令的責任和執行命令的責任分割開。
2、每一個命令都是一個操作:請求的一方發出請求,要求執行一個操作;接收的一方收到請求,並執行操作。
3、命令模式允許請求的一方和接收的一方獨立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知道請求是怎么被接收,以及操作是否被執行、何時被執行,以及是怎么被執行的。
4、命令模式使請求本身成為一個對象,這個對象和其他對象一樣可以被存儲和傳遞。
5、命令模式的關鍵在於引入了抽象命令接口,且發送者針對抽象命令接口編程,只有實現了抽象命令接口的具體命令才能與接收者相關聯。
2、每一個命令都是一個操作:請求的一方發出請求,要求執行一個操作;接收的一方收到請求,並執行操作。
3、命令模式允許請求的一方和接收的一方獨立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知道請求是怎么被接收,以及操作是否被執行、何時被執行,以及是怎么被執行的。
4、命令模式使請求本身成為一個對象,這個對象和其他對象一樣可以被存儲和傳遞。
5、命令模式的關鍵在於引入了抽象命令接口,且發送者針對抽象命令接口編程,只有實現了抽象命令接口的具體命令才能與接收者相關聯。