1 概念
一种高内聚模式,将一个请求封装成一个对象,从而让你使用的不同请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
2 概念解释
是一种数据驱动的设计模式,请求以命令形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适对象并把该命令传给对应对象,该对象执行命令。
命令模式通用类图如下:
3 使用场景
- 认为是使用命令的地方,如GUI开发,模拟DOS命令等
- 类似触发反馈机制处理等
4 命令模式优缺点
4.1 命令模式优点
-
类间解耦
调用者和接收者之间无依赖关系,调用者实现功能只需调用Command抽象类方法即可
-
可拓展性
Command子类可以非常容易地拓展,调用者invoker和高层次的模块Client不产生严重的代码耦合
-
命令模式搭配其他模式效果更佳
命令模式结合责任链模式,实现命令族解析任务;结合模板模式,减少Command类的膨胀
4.2 命令模式的缺点
命令多的话,命令类会膨胀
5 参考例子
5.1 创建Command接口
public interface ICommand {
void execute();
}
5.2 创建命令执行对象
public class Receiver {
public void execute(){
System.out.println("receiver execute ... ");
}
}
5.3 创建具体Command实现类
public class ConcreteCommandA implements ICommand {
private Receiver receiver;
public ConcreteCommandA(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute() {
System.out.println("ConcreteCommandA execute ...");
receiver.execute();
}
}
public class ConcreteCommandB implements ICommand {
private Receiver receiver;
public ConcreteCommandB(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute() {
System.out.println("ConcreteCommandB execute ...");
receiver.execute();
}
}
5.4 创建命令入口
public class Invoker {
private ICommand concreteCommandA, concreteCommandB;
public Invoker(ICommand concreteCommandA, ICommand concreteCommandB){
this.concreteCommandA = concreteCommandA;
this.concreteCommandB = concreteCommandB;
}
public void orderA(){
concreteCommandA.execute();
}
public void orderB(){
concreteCommandB.execute();
}
}
5.5 调用
public static void main(String[] args) {
Receiver receiver = new Receiver();
Invoker invoker = new Invoker(new ConcreteCommandA(receiver), new ConcreteCommandB(receiver));
invoker.orderA();
invoker.orderB();
}
5.6 输出
ConcreteCommandA execute ...
receiver execute ...
ConcreteCommandB execute ...
receiver execute ...