14

我对命令模式非常熟悉,但我还不了解 Functor 和命令之间的理论区别。特别是,我正在考虑 Java 实现。两者基本上都是编程表示为对象的“动词”。然而,就仿函数而言,正如我从一些示例中看到的,匿名内部类实现似乎很常见。那里的任何人都可以很好地为我解决这个问题吗?

4

7 回答 7

18

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

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

于 2008-11-03T11:52:36.620 回答
8

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

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

于 2008-11-03T12:44:59.383 回答
8

这是来自GOF的答案:

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

于 2009-01-16T19:23:33.193 回答
5

Apache Commons Functor页面的描述中:


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

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

  • 函数式编程
  • 高阶函数
  • 内部迭代器
  • 通过组合重用和专业化,而不是继承和重载
  • 通用“回调”或“扩展点”API
  • 通用“过滤器”或谓词 API
  • 许多“行为”设计模式,例如访问者、策略、责任链等。
于 2008-11-03T11:43:10.040 回答
4

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

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

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

我希望这对你有帮助。

于 2011-05-17T10:45:45.440 回答
3

我认为函子是命令模式的一个组件,它还涉及其他基础设施,例如调用者和命令接收者。

于 2008-11-03T12:08:59.707 回答
3

在 Java 中使用命令模式是因为我们在 Java 中没有闭包。Functors 是一种实现闭包的尝试。

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

于 2008-11-03T13:12:56.537 回答