C# 命令模式-目的?

C# 命令模式-目的?,c#,c++,design-patterns,C#,C++,Design Patterns,读完这篇文章: 我仍然不太明白我们为什么需要它。命令模式将知道如何执行某些工作的代码与知道何时需要执行以及使用哪些参数的代码分开 最明显的例子是一个按钮,它知道你什么时候点击它,但不知道那一刻该做什么。命令模式允许您将do some work对象传递给按钮,按钮在单击该对象时调用该对象。它描述了问题的解决方案。主要是,我们希望发出命令,而不希望在8个类上定义30个方法来实现这一点。通过使用提到的模式,我们发出一个命令对象,该对象可以随意忽略它,或者以某种方式对其进行操作。命令对象的复杂性是由实现

读完这篇文章:


我仍然不太明白我们为什么需要它。

命令模式将知道如何执行某些工作的代码与知道何时需要执行以及使用哪些参数的代码分开


最明显的例子是一个按钮,它知道你什么时候点击它,但不知道那一刻该做什么。命令模式允许您将do some work对象传递给按钮,按钮在单击该对象时调用该对象。

它描述了问题的解决方案。主要是,我们希望发出命令,而不希望在8个类上定义30个方法来实现这一点。通过使用提到的模式,我们发出一个
命令
对象,该对象可以随意忽略它,或者以某种方式对其进行操作。
命令
对象的复杂性是由实现定义的,但这是告诉对象“嘿,做这个”的好方法

此外,由于我们已将其封装在一个对象中,因此我们可以进一步对命令进行排队,按我们希望的时间间隔分派命令,还可以恢复命令(当然,前提是您发送命令的对象既可以“撤消”命令,也可以“执行”)

因此,想象一下一个绘图包,它允许您向画布添加形状。每次用户执行此操作时,都会发出以下命令:

m_Canvas.push_back(new Line(1.0f, 2.0f));
m_Canvas.push_back(new Line(3.5f, 3.1f));
m_Canvas.push_back(new Circle(2.0f, 3.0f, 1.5f));
等等。这假定
是从一个公共
命令
基类派生的


我们的渲染器可以使用这个画布集合作为一种渲染方式,而取消执行只是删除最后执行的命令。通过跟踪用户在单独的集合中执行的操作,我们还可以重做。

我们的想法是,如果命令被封装为对象,那么这些命令就可以被捕获、存储、排队、重放等

它还使命令更容易知道如何撤消自己(即执行反向操作),以便在处理命令时,可以将其存储在列表中,然后以相反顺序“撤消”,以恢复命令执行前的状态


它还将命令的发送方与接收方分离。这可以允许多个事物生成相同的命令(例如菜单项和按钮),它们将以相同的方式处理。

基本上,命令模式是在Java(或C#)中部分实现“作为对象的功能”的一种方式

由于不能只创建函数(或方法)并对其执行任何操作,如将其作为参数传递给其他函数或将其保存在变量中以供以后执行,因此这是解决方法:

  • 在类中封装一些代码(这是您的
    execute
    方法)
  • 实例化该类。现在,这个对象是“作为对象的函数”
  • 您可以将对象作为参数传递、保留或其他方式
  • 最后,您需要调用
    execute
    方法

  • 这是封装异步操作并将其参数和上下文保持在一个位置的好方法

    例如HTTP请求:您通过套接字发送请求,并等待响应到达。如果您的应用程序是web浏览器,则在请求完成之前,您不希望阻止,而是继续。如果响应到达,您必须在停止的上下文中继续,例如,读取数据并将其放在正确的位置(例如,将下载的图像数据放在某个位置以便以后渲染)。如果有一个大客户机类触发多个异步操作,那么将响应与它所属的上下文匹配可能会变得很棘手。响应可能以任意顺序到达。哪种反应属于什么?对于响应,应该做些什么?如何处理可能的错误?如果将这些请求封装在命令中,并让命令只接收它们自己的响应,那么它们将更好地知道如何从那里继续并处理响应。如果您有请求/响应序列,那么跟踪序列的状态也会容易得多。可以将命令分组为复合命令(复合模式)。 客户端将所需的一切传递给命令,并等待命令完成,报告成功或错误


    使用多线程的另一大优势是:如果操作所需的所有数据都封装在command对象中,则可以轻松地将命令移动到另一个线程并在那里执行,而不必像在线程之间共享对象时遇到的常见锁定难题。创建命令,将所需的一切传递给它(复制,而不是引用),传递给其他线程,仅在收到结果时同步,完成

    你看过这个网站了吗?如果您:
    需要向对象发出请求,而不知道所请求的操作或请求的接收者,请使用此选项。
    很好地总结了这一点。我的主要用途是实现撤销/重做功能。建议你想出一个符合你链接到的网页“意图”部分的问题,也许?你需要它来弥补你的语言甚至最基本的FP功能的不足。