阅读本文后:http://sourcemaking.com/design_patterns/command
我还是不太明白为什么我们需要这个。
发布于 2010-12-02 20:04:31
其思想是,如果命令被封装为对象,那么这些命令可以被捕获、存储、排队、重放等。
这也使得命令更容易知道如何撤消自己(即执行相反的操作),以便如果命令被处理,它可以存储在一个列表中,然后以相反的顺序“撤消”,以恢复命令完成之前的状态。
此外,它还将命令的发送者与接收者解耦。这可以允许多个事物生成相同的命令(例如,菜单项和按钮),并且它们将以相同的方式进行处理。
发布于 2010-12-03 01:58:42
这是封装异步操作并将它们的参数和上下文保存在一个位置的好方法。
例如,HTTP请求:您通过套接字发送请求,并等待响应到达。如果你的应用程序是web浏览器,你不想在请求完成之前阻塞,而是继续前进。如果响应到达,您必须在您停止的上下文中继续,例如读取数据并将其放到正确的位置(例如,将下载的图像数据放在某个地方以供以后渲染)。如果您有一个大的客户端类触发多个异步操作,那么将响应与它所属的上下文进行匹配可能会变得很棘手。响应可能以任意顺序到达。哪个响应属于什么?该如何处理响应呢?如何处理可能出现的错误?如果您将这些请求封装在命令中,并让这些命令只接收它们自己的响应,那么它们将更好地知道如何从那里继续并处理响应。如果您有请求/响应序列,那么跟踪序列的状态也会容易得多。可以将命令分组为复合命令(复合模式)。客户端将所需的所有内容传递给命令,并等待命令完成,并报告成功或错误。
另一个很大的优势是在使用多线程时:如果操作所需的所有数据都封装在命令对象中,则很容易将命令移动到另一个线程并在那里执行,而不会出现在线程之间共享对象时通常会遇到的锁定问题。命令,将它需要的一切传递给它(复制,而不是通过引用),传递给其他线程,只有在收到结果时才同步,完成。
发布于 2010-12-02 20:02:10
命令模式将知道如何完成某些工作的代码与知道何时需要完成工作以及使用什么参数的代码分开。
最明显的例子是一个按钮,它知道你什么时候点击它,但不知道在那个时刻做什么工作。命令模式允许您将do-some work对象传递给按钮,该按钮在单击该对象时调用该对象。
https://stackoverflow.com/questions/4334696
复制相似问题