用途
指令模式 (Command)
将一個請求封裝為一個對象,進而使你可以用不同的請求對客戶進行參數化;
對請求排隊或請求日志,以及支援可撤銷的操作。
指令模式是一種行為型模式。
結構
圖-指令模式結構圖
Command : 用來聲明執行操作的接口。
abstract class Command {
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();
Invoker : 要求該指令執行這個請求。
class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
public void ExecuteCommand() {
command.Execute();
Receiver : 知道如何實施與執行一個與請求相關的操作,任何類都可能作為一個接收者。
class Receiver {
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();
互動
圖-指令模式互動圖
1、Client 建立一個 ConcreteCommand 對象并指定他的 Receiver 對象。
2、某個 Invoker 對象存儲該 ConcreteCommand 對象。
3、該 Invoker 通過調用 Command 對象的 Execute 操作來送出一個請求。若該指令是可撤銷的,ConcreteCommand 就在執行 Execute 操作之前存儲目前狀态以用于取消該指令。
4、ConcreteCommand 對象對調用它的 Receiver 的一些操作以執行該請求。
要點
1、指令模式的本質是對指令進行封裝,将發出指令的責任和執行指令的責任分割開。
2、每一個指令都是一個操作:請求的一方送出請求,要求執行一個操作;接收的一方收到請求,并執行操作。
3、指令模式允許請求的一方和接收的一方獨立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知道請求是怎麼被接收,以及操作是否被執行、何時被執行,以及是怎麼被執行的。
4、指令模式使請求本身成為一個對象,這個對象和其他對象一樣可以被存儲和傳遞。
5、指令模式的關鍵在于引入了抽象指令接口,且發送者針對抽象指令接口程式設計,隻有實作了抽象指令接口的具體指令才能與接收者相關聯。
推薦
本文屬于
JAVA設計模式系列。
參考資料
《大話設計模式》
《HeadFirst設計模式》