函子模式和命令模式有什么区别?
-
06-07-2019 - |
题
我非常熟悉命令模式,但我还不明白函子和命令之间理论上的区别。特别是,我正在考虑 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试图实现闭包。
带闭包的语言不需要命令模式。