指令模式Command
指令模式:将一個請求封裝為一個對象,進而使我們可用不同的請求對客戶進行參數化;對請求排毒或者記錄請求日志,以及支援可撤銷的操作。也稱之為:動作Action模式,事務Transaction模式
結構:
Command抽象指令類
ConcreteCommand具體指令類
Invoker調用者/請求者
請求的發送者,它通過指令對象來執行請求,一個調用者并不需要在設計時确定其接收者。是以它至于抽象指令類之間存在慣量。在程式運作時,将調用指令對象的execute(),間接調用接收者的相關操作。
Receiver接收者:
接收者執行與請求相關的操作,具體實作對請求的業務處理
未抽象前,實際執行操作内容的對象。
Client客戶類。
在客戶類中需要建立調用者對象,具體指令類對象,在建立具體指令對象時指定對應的接收者。
發送者和接收者之間沒有直接關系,都通過指令對象間接調用。
場景:
Struts2中,action的整個調用過程中就有指令模式
資料庫事務機制的底層實作
指令的撤銷和回複。
================================================
/**
* 指令的真實執行者。
* 時間:2015年4月14日19:32:27
*
*/
package com.bjsxt.cn.command;
import java.rmi.activation.ActivationGroupDesc.CommandEnvironment;
public class Receiver {
public void action() {
System.out.println("我作為接收者,是實際的指令執行者。");
System.out.println("Receiver.action()");
}
}
===========================================
/**
* 抽象指令類
*/
package com.bjsxt.cn.command;
/**
* 這個方法是一個傳回結果為空的方法
* 實際項目中,可根據需求設計多個不同的方法。
* @author wanna_000
*
*/
public interface Command {
public void execute();
}
class ConcreteCommand implements Command {
private Receiver receiver;
public ConcreteCommand(Receiver receiver) {
super();
this.receiver = receiver;
}
@Override
public void execute() {
//在調用前後做一些我需要的處理
receiver.action();
}
}
==============================================
/**
* 調用者/發起者
*/
package com.bjsxt.cn.command;
public class Invoker {
//也可以通過List<Command>容納很多指令,進行批處理,資料庫底層的事務管理就是這種模式。
private Command command;
public Invoker(Command command) {
super();
this.command = command;
}
//業務方法,用于調用指令類的方法
public void call() {
command.execute();
}
}
================================================
/**
* 客戶程式類:測試指令模式的使用
*/
package com.bjsxt.cn.command;
public class Client {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(command);
invoker.call();
}
}
/*
我作為接收者,是實際的指令執行者。
Receiver.action()
*
*/