命令模式把一个请求或者操作封装到命令对象中,这些请求或者操作的内容包括接收者的信息,然后将该命令对象交由执行者执行,执行者不需要关心命令的接收人或者命令的具体内容,因为这些信息均被封装到命令对象中。
命令模式中涉及的角色及其作用如下:
命令接口(Command):声明执行操作的接口,
此接口中有一个执行命令的方法 execute(CommandReceiver receiver) 可见此方法的参数就是命令的接收者。而CommandReceiver 又是命令接受者的接口,实现了此接口的不同的命令具体接收者有选择地执行接口中的方法。
命令接口实现(ConcreteCommand):不同的命令接口实现类实现上面接口的execute方法,在方法中根据需要使命令接收者调用不同的方法。
命令请求者(Invoker):请求执行此次命令
命令接收人(Receiver):由命令接口的实现类来维护Receiver实例,并在命令执行时处理相应的任务。
下面是代码示例
命令接口
public interface Command { /** * 执行命令,参数为命令接收人 */ void execute(CommandReceiver receiver); }
/** * 命令接收者接口,定义了不同的要实现的方法 */ public interface CommandReceiver { //命令执行者方法A void doSomethingA(); //命令执行者方法B void doSomethingB(); }
/** * 命令请求执行者 * 其中的请求执行方法以Command接口的实现类为参数 */ public class CommandExecutor { public void execute(Command command) { command.execute(new CommandReceiverImpl()); } }
/** * 命令实现类A,要求接收者实现对象调用A方法 */ public class CommandA implements Command { @Override public void execute(CommandReceiver receiver) { receiver.doSomethingA(); } }
/** * 命令实现类B,要求接收者对象执行方法B */ public class CommandB implements Command { @Override public void execute(CommandReceiver receiver) { receiver.doSomethingB(); } }
/** * 命令接收者实现对象,定义了具体的方法要操作的内容 */ public class CommandReceiverImpl implements CommandReceiver { @Override public void doSomethingA() { System.out.println("doSomethingA"); } @Override public void doSomethingB() { System.out.println("doSomethingB"); } }
/** * 调用客户端示例 */ public class Client { public static void main(String[] args) { CommandExecutor executor=new CommandExecutor(); Command commandA=new CommandA(); executor.execute(commandA); Command commandB=new CommandB(); executor.execute(commandB); } }