小A:“命令模式的適用哪些環境?”
大B:“1、需要抽象出待執行的動作,然後以參數的形式提供出來——類似於過程設計中的回調機制。而命令模式正是回調機制的一個面向對象的替代品。2、在不同的時刻指定、排列和執行請求。一個命令對象可以有與初始請求無關的生存期。3、需要支持取消操作。4、支持修改日誌功能。這樣當系統崩潰時,這些修改可以被重做一遍。5、需要支持事務操作。”
在此寫了7個java類來描述說明Command設計模式的實現方式;
1、Control.java命令控制者對象類
2、Tv.java命令接收者對象類
3、Command.java命令接口類
4、CommandChannel.java頻道切換命令類
5、CommandOff.java關機命令類
6、CommandOn.java開機命令類
7、CommandTest.java帶有main方法的測試類(命令發送者)
……1、Control.java
packagemand;
//命令控制者
publicclassControl{
privateCommandonCommand,offCommand,changeChannel;
publicControl(Commandon,Commandoff,Commandchannel){
onCommand=on;
offCommand=off;
changeChannel=channel;
}
publicvoidturnOn(){
onCommand.execute();
}
publicvoidturnOff(){
offCommand.execute();
}
publicvoidchangeChannel(){
changeChannel.execute();
}
}
……1end
……2、Tv.java
packagemand;
//命令接收者
publicclassTv{
publicintcurrentChannel=0;
publicvoidturnOn(){
System.out.println(“Thetelevisinoison.”);
}
publicvoidturnOff(){
System.out.println(“Thetelevisionisoff.”);
}
publicvoidchangeChannel(intchannel){
this.currentChannel=channel;
System.out.println(“NowTVchannelis”+channel);
}
}
……2end
……3、Command.java
packagemand;
//命令接口
publicinterfaceCommand{
voidexecute();
}
……3end
……4、CommandChannel.java
packagemand;
//頻道切換命令
publicclassCommandChannelimplementsCommand{
privateTvmyTv;
privateintchannel;
publicCommandChannel(Tvtv,intchannel){
myTv=tv;
this.channel=channel;
}
publicvoidexecute(){
myTv.changeChannel(channel);
}
}
……4end
……5、CommandOff.java
packagemand;
//關機命令
publicclassCommandOffimplementsCommand{
privateTvmyTv;
publicCommandOff(Tvtv){
myTv=tv;
}
publicvoidexecute(){
myTv.turnOff();
}
}
……5end
……6、CommandOn.java
packagemand;
//開機命令
publicclassCommandOnimplementsCommand{
privateTvmyTv;
publicCommandOn(Tvtv){
myTv=tv;
}
publicvoidexecute(){
myTv.turnOn();
}
}
……6end
……7、CommandTest.java
packagemand;
//命令發送者
publicclassCommandTest{
publicstaticvoidmain(String[]args){
//命令接收者
TvmyTv=newTv();
//開機命令
CommandOnon=newCommandOn(myTv);
//關機命令
CommandOffoff=newCommandOff(myTv);
//頻道切換命令
CommandChannelchannel=newCommandChannel(myTv,2);
//命令控制對象
Controlcontrol=newControl(on,off,channel);
//開機
control.turnOn();
//切換頻道
control.changeChannel();
//關機
control.turnOff();
}
}
……7end