我对命令模式非常熟悉,但我还不了解Functor和命令之间的理论差异。特别是,我正在考虑Java实现。两者基本上都是编程“动词”,表示为对象。但是,在仿函数的情况下,正如我从一些示例中看到的那样,匿名内部类实现似乎很常见。谁能在那里为我清楚地解决这个问题?
答案 0 :(得分:17)
仿函数是一种实现,一种使对象表现得像函数的方法。
'命令模式'是一种设计模式 仿函数是实现“命令模式”的一种方式。
答案 1 :(得分:7)
仿函数是一种'语法级别'概念 - 它将代码打包在一个对象中,该对象可以在语法上像函数指针一样处理 - 也就是说,可以通过将参数列表放在括号后的“括号”来“调用”。在C ++中,您可以通过重写operator()来使类成为一个仿函数。
命令模式中的命令是一个包含一些可运行功能的对象,但不要求它是一个仿函数。例如,它可以是一个实现接口ICommand的类,允许通过调用Do()来运行它的命令。
答案 2 :(得分:7)
以下是GOF:
的答案Coplien描述了如何实施 函子,函数对象, 在C ++中[Cop92]。他获得了学位 他们使用的透明度 重载函数调用操作符 (操作者())。命令模式是 不同;它的重点是 维护 接收器和接收器之间的绑定 功能(即动作),而不仅仅是 维护功能 。
答案 3 :(得分:5)
来自Apache Commons Functor页面的说明:
仿函数是一个可以作为对象操作的函数,或者是一个表示单个通用函数的对象。
Functors支持并鼓励许多强大的编程技术,包括:
答案 4 :(得分:4)
根据GOF(Gang of Four)引用的定义(由Comptrol),Functor和Command是两种不同的模式。
如前所述,Functor表示一个包含服务方法的类,换句话说:仿函数类的主要职责是存储用自己的方法实现的特定逻辑。因此,我们可以在仿函数中思考一个容器对于它自己的方法的内在逻辑。从历史上看,Functor很难实现,因为在Java规范中没有“函数指针”的实现和/或概念,这在注册的回调(观察者模式的特定实现)的上下文中非常有用。
命令模式表示旨在将Invoker实体与Receiver实体分离的设计模式。它主要用于需要从动作侦听器(想到GUI)中去除动作(生成事件)。它有一个方法负责执行一个特定的对象接收器来执行特定操作(取决于来自其自己的超类的特定命令实现);在所述定义中,执行方法可以被定义为“不智能”,实际上智能实现本身可以实现操作逻辑而不是将其委托给第三对象。 当我们有一个智能执行方法时,我们正在实现一个仿函数,我们将仿函数(特定命令子部分实现)放在命令模式的上下文中。
我希望这会对你有所帮助。
答案 5 :(得分:3)
我认为仿函数是命令模式的一个组成部分,它还涉及其他基础结构,例如调用者和命令接收者。
答案 6 :(得分:3)
Command模式在Java中使用,因为我们在Java中没有闭包。 Functors试图实现闭包。
带闭包的语言不需要命令模式。