定义
将一个请求封闭成一个对象 ,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能.
角色
接收者角色:
干活的角色,命令传递到这里是应该被执行的.命令角色:
执行的所有命令才在这里声明调用者角色:
接收到命令,并执行命令
优点
- 类间解耦,调用者与接收者间没有任何的依赖关系.
- 可扩展性,命令角色的子类非常好扩展.
- 结合其他模式更优秀(责任链模式,模板方法模式等)
缺点
命令越多,其子类就越多.
通用代码
抽象接收者
public abstract class Receiver {
public abstract void doSomething();
}
具体接收者
public class ConcreteReceiver1 extends Receiver {
@Override
public void doSomething() {
}
}
public class ConcreteReceiver2 extends Receiver {
@Override
public void doSomething() {
}
}
抽象命令类
public abstract class Command {
public abstract void execute();
}
具体命令类
public class ConcreteCommand1 extends Command {
private Receiver receiver;
public ConcreteCommand1(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
this.receiver.doSomething();
}
}
public class ConcreteCommand2 extends Command {
private Receiver receiver;
public ConcreteCommand2(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
this.receiver.doSomething();
}
}
调用者类
public class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void action(){
command.execute();
}
}
场景类
public class Client {
public static void main(String[] args) {
Invoker invoker = new Invoker();
Receiver receiver = new ConcreteReceiver1();
Command command = new ConcreteCommand1(receiver);
invoker.setCommand(command);
invoker.action();
}
}