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

有帮助吗?

解决方案

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

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

其他提示

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

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

以下是来自 GOF 的答案:

  

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

从描述来看 Apache Commons 函子 页:


函子是一个可以作为对象进行操作的函数,或者是代表单个通用函数的对象。

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

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

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

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top