大话设计模式
字体: 16 + -

第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