1. 程式人生 > >命令模式(command)

命令模式(command)

命令模式:將一個請求封裝為一個物件,從而使我們可用不同的請求對客戶進行引數化;對請求排隊或者記錄請求日誌,以及支援可撤銷的操作。也稱之為:動作Action模式,事務Transaction模式。

命令模式的結構:
1.Command 抽象命令類
2.ConcreteCommand 具體命令類
3.Invoker 呼叫者/請求者:請求的傳送者,它通過命令物件來執行一個請求。一個呼叫者並不需要再設計的時候確定其接收者,因此它只與抽象命令之間存在關聯。在程式執行時,將呼叫命令物件的execute(),間接呼叫接收者的相關操作。
4.Receiver 接收者:接收者執行與請求相關的操作,具體實現對請求的業務處理。

下面用程式碼來說明:
1.建立命令執行者receiver

/**
 * 真正的命令的執行者
 * @author Administrator
 *
 */
public class Receiver {
    public void action(){
        System.out.println("Receiver.action()");
    }
}

2.建立Command介面和ConcreteCommand實現類:

public interface Command {
    /**
     * 這個方法是一個返回結果為空的方法。
     * 實際專案中,可以根據需求設計多個不同的方法
     */
void execute(); } class ConcreteCommand implements Command { private Receiver receiver; //命令的真正的執行者 public ConcreteCommand(Receiver receiver) { super(); this.receiver = receiver; } @Override public void execute() { //命令真正執行前或後,執行相關的處理! receiver.action(); } }

3.建立Invoker,命令的發起者:

//呼叫者/發起者
public class Invoke {

    private Command command;   //也可以通過容器List<Command>容納很多命令物件,進行批處理。資料庫底層的事務管理就是類似的結構!

    public Invoke(Command command) {
        super();
        this.command = command;
    } 

    //業務方法 ,用於呼叫命令類的方法
    public void call(){
        command.execute();
    }
}

4.客戶端測試:

public class Client {
    public static void main(String[] args) {
        Command c = new ConcreteCommand(new Receiver());
        Invoke i = new Invoke(c);
        i.call();

//      new Receiver().action();

    }
}

開發中應用場景:
1.Struts2中action的整個呼叫過程;
2.資料庫事務機制的底層實現;
3.命令的撤銷與恢復;