在此寫了7個java類來描述說明Command設(shè)計模式的實現(xiàn)方式;
1、 Control.java 命令控制者對象類
2、 Tv.java 命令接收者對象類
3、 Command.java 命令接口類
4、 CommandChannel.java 頻道切換命令類
5、 CommandOff.java 關(guān)機命令類
6、 CommandOn.java 開機命令類
7、 CommandTest.java 帶有main方法的測試類(命令發(fā)送者)
=============== 1、 Control.java
package command;
//命令控制者
public class Control {
private Command onCommand, offCommand, changeChannel;
public Control(Command on, Command off, Command channel) {
onCommand = on;
offCommand = off;
changeChannel = channel;
}
public void turnOn() {
onCommand.execute();
}
public void turnOff() {
offCommand.execute();
}
public void changeChannel() {
changeChannel.execute();
}
}
=============== 1 end
=============== 2、 Tv.java
package command;
//命令接收者
public class Tv {
public int currentChannel = 0;
public void turnOn() {
System.out.println("The televisino is on.");
}
public void turnOff() {
System.out.println("The television is off.");
}
public void changeChannel(int channel) {
this.currentChannel = channel;
System.out.println("Now TV channel is " + channel);
}
}
=============== 2 end
=============== 3、 Command.java
package command;
//命令接口
public interface Command {
void execute();
}
=============== 3 end
=============== 4、 CommandChannel.java
package command;
//頻道切換命令
public class CommandChannel implements Command {
private Tv myTv;
private int channel;
public CommandChannel(Tv tv, int channel) {
myTv = tv;
this.channel = channel;
}
public void execute() {
myTv.changeChannel(channel);
}
}
=============== 4 end
=============== 5、 CommandOff.java
package command;
//關(guān)機命令
public class CommandOff implements Command {
private Tv myTv;
public CommandOff(Tv tv) {
myTv = tv;
}
public void execute() {
myTv.turnOff();
}
}
=============== 5 end
=============== 6、 CommandOn.java
package command;
//開機命令
public class CommandOn implements Command {
private Tv myTv;
public CommandOn(Tv tv) {
myTv = tv;
}
public void execute() {
myTv.turnOn();
}
}
=============== 6 end
=============== 7、 CommandTest.java
package command;
//命令發(fā)送者
public class CommandTest{
public static void main(String[] args){
//命令接收者
Tv myTv = new Tv();
//開機命令
CommandOn on = new CommandOn(myTv);
//關(guān)機命令
CommandOff off = new CommandOff(myTv);
//頻道切換命令
CommandChannel channel = new CommandChannel(myTv, 2);
//命令控制對象
Control control = new Control( on, off, channel);
//開機
control.turnOn();
//切換頻道
control.changeChannel();
//關(guān)機
control.turnOff();
}
}
=============== 7 end
Command模式通常可應(yīng)用到以下場景:
1 Multi-level undo(多級undo操作)
如果系統(tǒng)需要實現(xiàn)多級回退操作,這時如果所有用戶的操作都以command對象的形式實現(xiàn),系統(tǒng)可以簡
單地用stack來保存最近執(zhí)行的命令,如果用戶需要執(zhí)行undo操作,系統(tǒng)只需簡單地popup一個最近的
command對象然后執(zhí)行它的undo()方法既可。
2 Transactional behavior(原子事務(wù)行為)
借助command模式,可以簡單地實現(xiàn)一個具有原子事務(wù)的行為。當一個事務(wù)失敗時,往往需要回退到執(zhí)
行前的狀態(tài),可以借助command對象保存這種狀態(tài),簡單地處理回退操作。
3 Progress bars(狀態(tài)條)
假如系統(tǒng)需要按順序執(zhí)行一系列的命令操作,如果每個command對象都提供一個
getEstimatedDuration()方法,那么系統(tǒng)可以簡單地評估執(zhí)行狀態(tài)并顯示出合適的狀態(tài)條。
4 Wizards(導(dǎo)航)
通常一個使用多個wizard頁面來共同完成一個簡單動作。一個自然的方法是使用一個command對象來封
裝wizard過程,該command對象在第一個wizard頁面顯示時被創(chuàng)建,每個wizard頁面接收用戶輸入并設(shè)
置到該command對象中,當最后一個wizard頁面用戶按下“Finish”按鈕時,可以簡單地觸發(fā)一個事件
調(diào)用execute()方法執(zhí)行整個動作。通過這種方法,command類不包含任何跟用戶界面有關(guān)的代碼,可以
分離用戶界面與具體的處理邏輯。
5 GUI buttons and menu items(GUI按鈕與菜單條等等)
Swing系統(tǒng)里,用戶可以通過工具條按鈕,菜單按鈕執(zhí)行命令,可以用command對象來封裝命令的執(zhí)行。
6 Thread pools(線程池)
通常一個典型的線程池實現(xiàn)類可能有一個名為addTask()的public方法,用來添加一項工作任務(wù)到任務(wù)
隊列中。該任務(wù)隊列中的所有任務(wù)可以用command對象來封裝,通常這些command對象會實現(xiàn)一個通用的
接口比如java.lang.Runnable。
7 Macro recording(宏紀錄)
可以用command對象來封裝用戶的一個操作,這樣系統(tǒng)可以簡單通過隊列保存一系列的command對象的狀
態(tài)就可以記錄用戶的連續(xù)操作。這樣通過執(zhí)行隊列中的command對象,就可以完成"Play back"操作了。
8 Networking
通過網(wǎng)絡(luò)發(fā)送command命令到其他機器上運行。
9 Parallel Processing(并發(fā)處理)
當一個調(diào)用共享某個資源并被多個線程并發(fā)處理時。