1 概念 一种高内聚模式,将一个请求封装成一个对象,从而让你使用的不同请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
2 概念解释 是一种数据驱动的设计模式,请求以命令形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适对象并把该命令传给对应对象,该对象执行命令。
命令模式通用类图如下:
文章图片
3 使用场景
- 认为是使用命令的地方,如GUI开发,模拟DOS命令等
- 类似触发反馈机制处理等
- 类间解耦
【设计模式|设计模式-命令模式】调用者和接收者之间无依赖关系,调用者实现功能只需调用Command抽象类方法即可
- 可拓展性
Command子类可以非常容易地拓展,调用者invoker和高层次的模块Client不产生严重的代码耦合
- 命令模式搭配其他模式效果更佳
命令模式结合责任链模式,实现命令族解析任务;结合模板模式,减少Command类的膨胀
命令多的话,命令类会膨胀
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 ...
推荐阅读
- 面试|我经历的IT公司面试及离职感受(转)
- java|设计模式——创建型——工厂方法(Factory Method)
- 设计模式|设计模式_创建型模式——工厂方法
- 设计模式|设计模式——创建型软件设计模式——工厂方法模式
- 设计模式之装饰器模式
- 设计模式之设计原则
- 设计模式六大原则(5)(迪米特法则 最少知道)
- 观察者模式实现之EventBus(Google)
- Java高级面试|常见设计模式——装饰模式
- java设计模式——单例模式