第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