第186章

小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