命令模式定义
将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和回复的功能。
Receive接收者角色
该角色就是干活的角色,命令传递到这里是应该被执行的。
public abstract class Receiver{ //抽象接收者,定义每个接收者都必须完成的业务 public abstract void doSomething(); }
Command命令角色
需要执行的所有命令都在这里声明。
public abstract class Command{ //每个命令都必须有一个执行命令的方法 public abstract void execute(); }
具体的Command类
public class ConcreteCommand1 extends Command{ //对哪个Receiver类进行命令处理 private Receiver receiver; //构造函数传递接收者 public ConcreteCommand1(Receiver receiver){ this.receiver = receiver; } //必须实现一个命令 public void execute(){ //业务处理 this.receiver.doSomething(); } }
Invoker调用者角色
接收到命令,并执行命令。
public class Invoker{ private Command command; //接收命令 public void setCommand(Command command){ this.command = command; } //执行命令 public void action(){ this.command.execute(); } }
命令模式的优点:
类间的解耦,可扩展性
缺点:
命令很多时,Command的子类变多,类变得复杂。
命令模式扩充
public abstract class Command{ //定义一个子类的全局共享变量 protected final Receiver receiver; //实现类必须定义一个接收者 public Command(Receiver receiver){ this.receiver = receiver; } //每个命令类都必须有一个执行命令的方法 public abstract void execute(); }
public class ConcreteCommand1 extends Command{ //声明自己默认接收者 public ConcreteCommand1(){ super(new ConcreteCommand1()); } //设置新的接收者 public ConcreteCommand1(Receiver receiver){ super(receiver); } //每个具体的命令都必须实现一个命令 public void execute(){ //业务处理 super.receiver.doSomething(); } }
每个命令完成单一的职责,而不是根据接收者的不同完成不同的职责。在高层模块的调用时就不用考虑接收者是谁的问题。