小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