定义
将一个请求封闭成一个对象,从而让你使用不同的请求把客户端参数化,对请求排除或者记录请求日志,可以提供命令的撤销和恢复功能
角色
抽象命令类(Command):声明需要执行的命令,一般要对外公布一个方法来执行命令
命令类:对抽象命令类中的方法进行实现
调用者(Invoker):负责调用命令
接收者(Receiver):负责接收并执行命令
客户端(Client):最终调用类
优点
- 良好的封闭性(每个命令封装在一个命令类中)、扩展性
- 降低对象之间的耦合度
- 新的命令可以很容易地加入到系统中
- 可以比较容易地设计一个组合命令
- 调用同一方法实现不同的功能
缺点
- 针对每一个命令都需要设计一个具体命令类,因此可能会导致系统存在大量的命令类
- 命令过于简单时,本来几行代码可以搞定,这里就需要封装一个命令类
适用场景
- 适用于大多数请求-响应模式的功能
- 系统需要将请求调用者和请求接收者解耦时,可用命令模式使调用者和接收者不直接交互
类图
package com.vapy.behavior.Command;
/**
*
* @author vapy
*
*/
public abstract class Command {
public abstract void execute();
}
package com.vapy.behavior.Command;
/**
*
* @author vapy
*
*/
public class ConcreteCommand extends Command {
private Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
public void execute() {
this.receiver.executeCommand();
}
}
package com.vapy.behavior.Command;
/**
*
* @author vapy
*
*/
public class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void action() {
this.command.execute();
}
}
package com.vapy.behavior.Command;
/**
*
* @author vapy
*
*/
public class Receiver {
public void executeCommand() {
System.out.println("执行命令");
}
}
package com.vapy.behavior.Command;
/**
*
* @author vapy
*
*/
public class Client {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.action();
}
}
本文代码可在github查看:点击此处