命令模式(command)
阿新 • • 發佈:2019-01-03
命令模式:將一個請求封裝為一個物件,從而使我們可用不同的請求對客戶進行引數化;對請求排隊或者記錄請求日誌,以及支援可撤銷的操作。也稱之為:動作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.命令的撤銷與恢復;