behavioral_patterns/command.rst
.. _command:
.. contents:: 目录
在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。
命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。这就是命令模式的模式动机。
命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。
命令模式包含如下角色:
.. image:: /_static/Command.jpg
.. image:: /_static/seq_Command.jpg
.. literalinclude:: /code/Command/main.cpp :language: cpp :linenos: :lines: 1- :emphasize-lines: 10-13
.. literalinclude:: /code/Command/Receiver.h :language: cpp :linenos: :lines: 1-
.. literalinclude:: /code/Command/Receiver.cpp :language: cpp :linenos: :lines: 1-
.. literalinclude:: /code/Command/ConcreteCommand.h :language: cpp :linenos: :lines: 1- :emphasize-lines: 22
.. literalinclude:: /code/Command/ConcreteCommand.cpp :language: cpp :linenos: :lines: 1- :emphasize-lines: 23-26
.. literalinclude:: /code/Command/Invoker.h :language: cpp :linenos: :lines: 1- :emphasize-lines: 17-23
.. literalinclude:: /code/Command/Invoker.cpp :language: cpp :linenos: :lines: 1- :emphasize-lines: 20-23
运行结果:
.. image:: /_static/Command_run.jpg
命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
实例一:电视机遥控器
.. image:: /_static/Command_eg.jpg
时序图:
.. image:: /_static/seq_Command_eg.jpg
命令模式的优点
命令模式的缺点
在以下情况下可以使用命令模式:
很多系统都提供了宏命令功能,如UNIX平台下的Shell编程,可以将多条命令封装在一个命令对象中,只需要一条简单的命令即可执行一个命令序列,这也是命令模式的应用实例之一。
宏命令又称为组合命令,它是命令模式和组合模式联用的产物。
-宏命令也是一个具体命令,不过它包含了对其他命令对象的引用,在调用宏命令的execute()方法时,将递归调用它所包含的每个成员命令的execute()方法,一个宏命令的成员对象可以是简单命令,还可以继续是宏命令。执行一个宏命令将执行多个具体命令,从而实现对命令的批处理。