将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或者记录记录日志,以及支持可撤销的操作。
问题
在简单的 GUI 程序中,工程师可能会选择将业务代码和 UI 代码耦合在一起,但是这样带来的问题是很多 UI 控件执行的操作实际上是相同的,而且很多命令具有相似的代码。
为了解决这个问题,工程师可以选择将业务逻辑和 UI 代码进行分离,从而允许不同的组件共用同样的业务逻辑。
进一步地,我们可以将命令进行抽象,为所有命令实现相同的接口,按钮不执行命令,而是将命令进行排队,命令的实际执行被进一步延迟。由于命令进行了排队,因此我们就具备了一个命令队列,从而允许进行撤销等操作。
基本结构
命令模式的基本结构如下:
Invoker 实际上是不同 UI 组件的实例。Invoker 不执行命令,只是将命令入队。
Receiver 代表了执行命令的对象。