指令模式
屬于行為模式
指令模式将一個請求或者操作封裝到一個指令對象中。允許系統使用不同的請求将用戶端參數化,對請求排隊或者記錄請求日志,提供指令的撤銷,恢複能力
由于請求方和接收方被指令對象相對分割,進而有了下面這些優點:
1 指令模式使新的指令很容易被加入
2 允許接受請求方否決請求
3 可較容易地設計一個指令隊列
4 可以實作對請求的Undo,Redo
5 可以将指令計入日志
類圖一枚
指令模式設計5個角色:
客戶角色Client:用戶端,建立指令并确定接收對象
指令角色Command:所有具體指令的抽象接口
具體指令角色ConcreteCommand:接受者與行為之間的聯系,調用接受者相關操作
請求者角色Invoker:調用指令對象執行請求
接受者角色Receiver:具體實施動作
下面是最簡單的指令模式
首先是抽象的Command以及一個具體的ConcreteCommand,可以看到其中隻定義實作了一個execute方法,ConcreteCommand持有一個接受者對象,execute方法實際是調用receiver中的action方法。
public interface Command {
public void execute();
}
public class ConcreteCommand implements Command{
private Receiver receiver;
public void setReceiver(Receiver receiver){
this.receiver=receiver;
}
@Override
public void execute() {
receiver.action();
}
}
Receiver對象,其中隻有action方法,即表示實際需要進行的動作
public class Receiver {
public void action(){
System.out.println("Reciever has done the Action");
}
}
Invoker請求者對象,持有具體要委派的指令,并調用指令的execute方法
public class Invoker {
private Command command;
public void setCommand(Command command){
this.command=command;
}
public void runCommand(){
command.execute();
}
}
用戶端隻是負責建立指令和确定接受者,其中的連接配接由各自完成。
public class Client {
public static void main(String[] args) {
Receiver receiver=new Receiver();
ConcreteCommand command=new ConcreteCommand();
command.setReceiver(receiver);
Invoker invoker=new Invoker();
invoker.setCommand(command);
invoker.runCommand();
}
}
最終可以看到輸出了一行結果:
Reciever has done the Action
其實從上面的調用過程中就可以清楚的看到指令模式的整個運作過程:
1 用戶端建立指令對象,指明接受者
2 請求者對象儲存指令
3 請求者對象通過runCommand送出請求,在這之中,可以在指令角色中通過一個狀态變量控制undo redo或者其他操作的控制
4 指令對象調用接收者方法執行操作
在上面的例子并沒有展現出關于undo,redo的功能
而如果需要這類功能,同樣是在ConcreteCommand中進行處理,例如添加一個List來記錄前後操作,并在執行時更新。
指令模式有一個比較明顯的缺點,就是當指令數量比較多時,會産生相當數量的ConcreteCommand具體指令類。
總體來說指令模式即是由原來的請求-接收中間添加了一個指令對象,通過指令對象實作了兩者間的解耦,并添加某種程度的控制和記錄。
http://www.cnblogs.com/sjms/archive/2010/07/16/1778527.html
上面的部落格中有關于undo的一個簡單實作,應該說研磨設計模式是寫得非常淺顯易懂的,包括其中其他的部分 推薦一看