命令模式(Command):将一个请求封装成一个对象,从而使你可用不同的请求对对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
package com.thpin.repository.designpattern;
public class CommandDemo {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command commandA = new ConcreteCommandA(receiver);
Invoker invoker = new Invoker();
invoker.setCommand(commandA);
invoker.executeCommond();
Command commandB = new ConcreteCommandB(receiver);
invoker.setCommand(commandB);
invoker.executeCommond();
}
}
/*
* 命令接受者
*/
class Receiver {
public void actionA() {
System.out.println("执行请求A");
}
public void actionB() {
System.out.println("执行请求B");
}
}
/*
* 命令接口
*/
abstract class Command {
protected Receiver receiver;
public Command(Receiver receiver) {
this.receiver = receiver;
}
public abstract void execute();
}
/*
* 命令A
*/
class ConcreteCommandA extends Command {
public ConcreteCommandA(Receiver receiver) {
super(receiver);
}
public void execute() {
receiver.actionA();
}
}
/*
* 命令B
*/
class ConcreteCommandB extends Command {
public ConcreteCommandB(Receiver receiver) {
super(receiver);
}
public void execute() {
receiver.actionB();
}
}
/*
* 命令调用者
*/
class Invoker {
private Command command;
public void executeCommond() {
command.execute();
}
public Command getCommand() {
return command;
}
public void setCommand(Command command) {
this.command = command;
}
}
结果:
执行请求A
执行请求B
命令模式可以较容易地设计一个命令队列或日志,允许接收请求方决定是否要否决请求,也可以容易地实现请求方对请求撤销或重新请求,很容易加入新的命令因为新的具体命令类不影响其他类。命令模式把请求操作一个操作的对象和知道如何执行这一操作的对象分隔开。
有时候撤销/恢复操作并不需要,这时我们是否需要完整的实现命令模式呢?敏捷开发原则告诉我们,不要为代码添加猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般就不要急着去实现它,事实上,在需要重构的时候通过重构实现命令模式并不难,只有真正需要如撤销/恢复操作等功能时,把原来的代码重构成命令模式才有意义。