1. 意图
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
2. 别名
动作( A c t i o n ),事务( Tr a n s a c t i o n )
3. 动机
有时必须向某对象提交请求,但并不知道关于被请求的操作或请求的接受者的任何信息。例如,用户界面工具箱包括按钮和菜单这样的对象,它们执行请求响应用户输入。但工具箱不能显式的在按钮或菜单中实现该请求,因为只有使用工具箱的应用知道该由哪个对象做哪个操作。而工具箱的设计者无法知道请求的接受者或执行的操作。
命令模式通过将请求本身变成一个对象来使工具箱对象可向未指定的应用对象提出请求。这个对象可被存储并像其他的对象一样被传递。这一模式的关键是一个抽象的C o m m a n d类,它定义了一个执行操作的接口。其最简单的形式是一个抽象的E x e c u t e操作。具体的C o m m a n d子类将接收者作为其一个实例变量,并实现E x e c u t e操作,指定接收者采取的动作。而接收者有执行该请求所需的具体信息。
用C o m m a n d对象可很容易的实现菜单( M e n u),每一菜单中的选项都是一个菜单项(M e n u I t e m)类的实例。一个A p p l i c a t i o n类创建这些菜单和它们的菜单项以及其余的用户界面。
该A p p l i c a t i o n类还跟踪用户已打开的D o c u m e n t对象。该应用为每一个菜单项配置一个具体的C o m m a n d子类的实例。当用户选择了一个菜单项时,该M e n u I t e m对象调用它的C o m m a n d对象的E x e c u t e方法,而E x e c u t e执行相应操作。M e n u I t e m对象并不知道它们使用的是C o m m a n d的哪一个子类。C o m m a n d子类里存放着请求的接收者,而E x c u t e操作将调用该接收者的一个或多个操作。例如,P a s t e C o m m a n d支持从剪贴板向一个文档( D o c u m e n t )粘贴正文。P a s t e C o m m a n d的接收者是一个文档对象,该对象是实例化时提供的。E x e c u t e操作将调用该D o c u m e n t的P a s t e操作。
而O p e n C o m m a n d的E x e c u t e操作却有所不同:它提示用户输入一个文档名,创建一个相应的文档对象,将其入作为接收者的应用对象中,并打开该文档。
有时一个M e n u I t e m需要执行一系列命令。例如,使一个页面按正常大小居中的M e n u I t e m
可由一个C e n t e r D o c u m e n t C o m m a n d对象和一个N o r m a l S i z e C o m m a n d对象构建。因为这种需将多条命令串接起来的情况很常见,我们定义一个M a c r o C o m m a n d类来让一个M e n u I t e m执行任意数目的命令。M a c r o C o m m a n d是一个具体的C o m m a n d子类,它执行一个命令序列。M a c r o C o m m a n d没有明确的接收者,而序列中的命令各自定义其接收者。
请注意这些例子中C o m m a n d模式是怎样解耦调用操作的对象和具有执行该操作所需信息的那个对象的。这使我们在设计用户界面时拥有很大的灵活性。一个应用如果想让一个菜单与一个按钮代表同一项功能,只需让它们共享相应具体C o m m a n d子类的同一个实例即可。我们还可以动态地替换C o m m a n d对象,这可用于实现上下文有关的菜单。我们也可通过将几个命令组成更大的命令的形式来支持命令脚本(command scripting)。所有这些之所以成为可能乃是因为提交一个请求的对象仅需知道如何提交它,而不需知道该请求将会被如何执行。
标签:请求,对象,子类,接收者,模式,命令,COMMAND,一个,操作 From: https://blog.csdn.net/workflower/article/details/145078818