设计模式|设计模式-命令模式

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 ...

    推荐阅读