小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
package command;
//命令控制者
public class Control{
private Command onCommand,offCommand,changeChannel;
public Control(Command on,Command off,Command channel){
onCommand=on;
offCommand=off;
changeChannel=channel;
}
public void turnOn(){
onCommand。execute();
}
public void turnOff(){
offCommand。execute();
}
public void changeChannel(){
changeChannel。execute();
}
}
……1 end
……2、Tv。java
package command;
//命令接收者
public class Tv{
public int currentChannel=0;
public void turnOn(){
System。out。println(“The televisino is on。”);
}
public void turnOff(){
System。out。println(“The television is off。”);
}
public void changeChannel(int channel){
this。currentChannel=channel;
System。out。println(“Now TV channel is” channel);
}
}
……2 end
……3、Command。java
package command;
//命令接口
public interface Command{
void execute();
}
……3 end
……4、CommandChannel。java
package command;
//频道切换命令
public class CommandChannel implements Command{
private Tv myTv;
private int channel;
public CommandChannel(Tv tv,int channel){
myTv=tv;
this。channel=channel;
}
public void execute(){
myTv。changeChannel(channel);
}
}
……4 end
……5、CommandOff。java
package command;
//关机命令
public class CommandOff implements Command{
private Tv myTv;
public CommandOff(Tv tv){
myTv=tv;
}
public void execute(){
myTv。turnOff();
}
}
……5 end
……6、CommandOn。java
package command;
//开机命令
public class CommandOn implements Command{
private Tv myTv;
public CommandOn(Tv tv){
myTv=tv;
}
public void execute(){
myTv。turnOn();
}
}
……6 end
……7、CommandTest。java
package command;
//命令发送者
public class CommandTest{
public static void main(String[]args){
//命令接收者
Tv myTv=new Tv();
//开机命令
CommandOn on=new CommandOn(myTv);
//关机命令
CommandOff off=new CommandOff(myTv);
//频道切换命令
CommandChannel channel=new CommandChannel(myTv,2);
//命令控制对象
Control control=new Control(on,off,channel);
//开机
control。turnOn();
//切换频道
control。changeChannel();
//关机
control。turnOff();
}
}
……7 end