繁体   English   中英

Functor和Command模式有什么区别?

[英]What is the difference between a Functor and the Command pattern?

我对命令模式非常熟悉,但我还不了解Functor和命令之间的理论差异。 特别是,我正在考虑Java实现。 两者基本上都是编程“动词”,表示为对象。 但是,在仿函数的情况下,正如我从一些示例中看到的那样,匿名内部类实现似乎很常见。 谁能在那里为我清楚地解决这个问题?

仿函数是一种实现,一种使对象表现得像函数的方法。

“命令模式”是一种设计模式。
仿函数是实现“命令模式”的一种方法。

仿函数是一种“语法级别”概念 - 它将代码打包在一个对象中,该对象可以在语法上像函数指针一样处理 - 即可以通过将参数列表放在其后的括号中来“调用”它。 在C ++中,您可以通过重写operator()使类成为仿函数。

命令模式中的命令是一个包含一些可运行功能的对象,但不要求它是一个仿函数。 例如,它可以是实现接口ICommand的类,允许通过调用Do()来运行其命令。

以下是GOF的答案:

Coplien描述了如何在C ++ [Cop92]中实现函数的函数对象。 他通过重载函数调用操作符(operator())来实现其使用的一定程度的透明度。 命令模式不同; 它的重点是保持接收器和功能(即动作)之间的绑定 ,而不仅仅是维护功能

Apache Commons Functor页面的描述:


仿函数是可以作为对象操作的函数,或者是表示单个通用函数的对象。

Functors支持并鼓励一些强大的编程技术,包括:

  • 以功能风格编程
  • 高阶函数
  • 内部迭代器
  • 通过组合而不是继承和重载来重用和专门化
  • 通用的“回调”或“扩展点”API
  • 通用“过滤器”或谓词API
  • 许多“行为”设计模式,如访客,战略,责任链等。

根据GOF(Gang of Four)引用的定义(由Comptrol),Functor和Command是两种不同的模式。

如前所述,Functor表示一个包含服务方法的类,换句话说:仿函数类的主要职责是存储用自己的方法实现的特定逻辑。 因此,我们可以在仿函数中思考一个容器对于它自己的方法的内在逻辑。 从历史上看,Functor很难实现,因为在Java规范中不存在“函数指针”的实现和/或概念,这在注册的回调(观察者模式的特定实现)的上下文中非常有用。

命令模式表示旨在将Invoker实体与Receiver实体分离的设计模式。 它主要用于需要从动作侦听器(想到GUI)中去除动作(生成事件)。 它有一个方法负责执行一个特定的对象接收器来执行特定操作(取决于来自其自己的超类的特定命令实现); 在所述定义中,执行方法可以被定义为“不智能”,实际上智能实现本身可以实现操作逻辑而不是将其委托给第三对象。 当我们有一个智能执行方法时,我们正在实现一个仿函数,我们将仿函数(特定命令子部分实现)放在命令模式的上下文中。

我希望这对你有所帮助。

我认为仿函数是命令模式的一个组成部分,它还涉及其他基础结构,如调用者和命令接收者。

Command模式在Java中使用,因为我们没有Java中的闭包。 Functors试图实现闭包。

带闭包的语言不需要Command模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM