第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