Functor和Command模式有什么区别?

时间:2008-11-03 11:20:11

标签: java design-patterns oop theory functor

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

7 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:7)

以下是GOF

的答案
  

Coplien描述了如何实施   函子,函数对象,   在C ++中[Cop92]。他获得了学位   他们使用的透明度   重载函数调用操作符   (操作者())。命令模式是   不同;它的重点是 维护   接收器和接收器之间的绑定   功能(即动作),而不仅仅是    维护功能

答案 3 :(得分:5)

来自Apache Commons Functor页面的说明:


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

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

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

答案 4 :(得分:4)

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

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

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

我希望这会对你有所帮助。

答案 5 :(得分:3)

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

答案 6 :(得分:3)

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

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