一、概述
将一個請求封裝為一個對象,進而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支援可撤消的操作。
二、适用性
- 抽象出待執行的動作以參數化某對象。
- 在不同的時刻指定、排列和執行請求。
- 支援取消操作。
- 支援修改日志,這樣當系統崩潰時,這些修改可以被重做一遍。
- 用建構在原語操作上的高層操作構造一個系統。
三、參與者
- Command 聲明執行操作的接口。
- ConcreteCommand 将一個接收者對象綁定于一個動作。調用接收者相應的操作,以實作Execute。
- Client 建立一個具體指令對象并設定它的接收者。
- Invoker 要求該指令執行這個請求。
- Receiver 知道如何實施與執行一個請求相關的操作。任何類都可能作為一個接收者。
四、類圖

五、示例
- Command
package com.lyz.design.command;
/**
* Command
* @author binghe
*
*/
public abstract class Command {
protected Receiver receiver;
public Command(Receiver receiver) {
this.receiver = receiver;
}
public abstract void execute();
}
- ConcreteCommand
package com.lyz.design.command;
/**
* ConcreteCommand
* @author binghe
*
*/
public class CommandImpl extends Command {
public CommandImpl(Receiver receiver) {
super(receiver);
}
public void execute() {
receiver.request();
}
}
- Invoker
package com.lyz.design.command;
/**
* Invoker
* @author binghe
*
*/
public class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void execute() {
command.execute();
}
}
- Receiver
package com.lyz.design.command;
/**
* Receiver
* @author binghe
*
*/
public class Receiver {
public void receive() {
System.out.println("This is Receive class!");
}
}
- Test
package com.lyz.design.command;
/**
* Test
* @author binghe
*
*/
public class Test {
public static void main(String[] args) {
Receiver rec = new Receiver();
Command cmd = new CommandImpl(rec);
Invoker i = new Invoker();
i.setCommand(cmd);
i.execute();
}
}
- Result:
This is Receive class!