书城计算机大话设计模式
11030400000186

第186章 7 命令模式的适用环境

小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