策略模式的功能类比是什么?

2024-01-05

免责声明:我不使用函数式语言;只是试图理解 FP 的某些部分。

Google 建议使用 lambda 的一阶函数可以提供与策略模式提供的类似功能的文章。

然而我们需要以某种方式匹配数据和相应的 lambda。通过 OO 设计,这是自动完成的虚拟方法表 (VMT) http://en.wikipedia.org/wiki/Virtual_method_table,即类型本身携带了推理执行流所需的重要信息,使得进一步添加新行为变得容易(开放封闭原则):继承和覆盖。旧代码保持不变。功能模式匹配在这方面似乎是静态的,并且不允许这种动态。

当然,可以编写一个可配置的匹配行为来根据给定的数据选择 lambda,但这不是我们在 OOP 中开箱即用的吗?


最简单的方法,我认为大多数人在谈论取代策略模式的高阶函数时所指的就是将策略作为参数传递给通用代​​码。下面是一个 Scala 示例,它对两个数字执行策略,然后将结果乘以 3:

def commonCode(strategy: (Int, Int) => Int)(arg1: Int, arg2: Int) : Int = 
  strategy(arg1, arg2) * 3

您可以这样定义各种策略:

def addStrategy(arg1: Int, arg2: Int) : Int      = arg1 + arg2

def subtractStrategy(arg1: Int, arg2: Int) : Int = arg1 - arg2

添加这样的调用:

commonCode(addStrategy)(2, 3)      // returns 15
commonCode(subtractStrategy)(2, 3) // returns -3

您可以使用部分应用程序来避免在各处传递策略:

val currentStrategy = addStrategy _
...
val currentCommon = commonCode(currentStrategy)_
currentCommon(2, 3) // returns 15

这很常见,我们不称其为策略或模式。这只是基本的函数式编程。这strategy参数到commonCode函数就像任何其他数据一样。您可以将其与许多其他函数一起放入数据结构中。您可以使用闭包或部分应用程序来关联其他特定于策略的数据。你可以使用像这样的 lambdacommonCode(_ / _)以避免给你的策略命名。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

策略模式的功能类比是什么? 的相关文章

  • 正确使用术语 Monoid

    从下面的例子来看 我认为这样的说法是正确的String在串联运算下定义了一个幺半群 因为它是关联二元运算 并且String碰巧有一个身份元素 它是一个空字符串 scala gt Jane Doe Jane Doe res0 Boolean
  • 单例属性

    好吧 如果我创建一个单例类并通过公共静态属性公开单例对象 我明白了 但我的单例类还有其他属性 这些应该是静态的吗 这些也应该是私人的吗 我只想通过执行以下操作来访问单例类的所有属性 MySingletonClass SingletonPro
  • 使用接口或函数对象进行回调? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在面向对象中 通常使用接口来实现回调 粗略示例 class Message class IMsgProcessor public virtual
  • C# 扩展方法 - 设计模式

    我想知道 C 扩展方法是否基于任何现有的设计模式 设计模式只是一种众所周知的范例 即 当你想实现 X 时 就做 Y 面向对象语言 例如 C 中的一个众所周知的范例是 当您想要对对象的状态进行操作时 调用它的实例上的方法 但是 在创建扩展方法
  • 通过消除嵌套的 for 循环来改进此代码

    R 包corrplot除其他内容外 还包含这个漂亮的功能 cor mtest lt function mat conf level 0 95 mat lt as matrix mat n lt ncol mat p mat lt lowCI
  • 进度状态报告模式

    我正在实现需要显示进程栏 或进度百分比 的长时间运行的进程 长时间运行的过程的整体逻辑很复杂 各种分页数据检索 因此 我最终在代码中的不同位置硬编码了大量百分比 在更新完成百分比时 什么被认为是最佳设计模式 我发现 JFace 周围使用的模
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 使用 Reader Monad 进行依赖注入

    我最近看到了谈话极其简单的依赖注入 http www youtube com watch v ZasXwtTRkio and 无需体操的依赖注入 http vimeo com 44502327关于 Monads 的 DI 并留下了深刻的印象
  • Struts ActionForm 属性应该是什么类型?

    我使用 Struts 1 2 4 继承了这个巨大的遗留 Java Web 应用程序 我有一个关于 ActionForms 的具体问题 其中一些仅具有字符串属性 即使对于数字 其中一些使用看似合适的类型 整数 日期 字符串等 这里的最佳实践是
  • 函数式语言中的部分求值和函数内联有什么区别?

    我知道 函数内联就是用函数定义代替函数调用 部分评估是在编译时评估程序的已知 静态 部分 在 C 等命令式语言中 两者之间存在区别 其中运算符与函数不同 但是 在像 Haskell 这样的函数式语言 其中运算符也是函数 中 两者之间有什么区
  • duckmap 到底有什么作用?

    From 文档 https docs perl6 org routine duckmap duckmap将会应用 block每个元素上并返回一个新列表 其中包含块的已定义返回值 对于未定义的返回值 duckmap如果该元素实现了 将尝试下降
  • 当需要不同数量和类型的参数时如何创建操作委托列表

    我们有一组大约两打的类 它们继承自具有抽象 Validate 方法的基类 当然 每个类都有不同的验证需求 但它们之间的不同组合需要规则 因此 正如您可以想象的那样 这导致了大量代码重复 例如 A 类需要规则 1 3 6 和 9B 类需要规则
  • 如何在NodeJs中应用Java/Spring的分层架构?

    我已经尝试学习 NodeJS 有一段时间了 所有书籍和教程似乎都遵循类似的代码结构模式 例子 const express require express const app express app set view engine hbs a
  • 当前线程中的单例

    我的单身人士如下 public class CurrentSingleton private static CurrentSingleton uniqueInstance null private static object syncRoo
  • 你们中有多少人进行三层设计?

    多年来 三层设计一直是我数据库驱动应用程序的标准设计理念 它从未让我失望过 对于那些练习它的人 描述一下你的层次 我发现很多人混淆了业务层和数据访问层 使其更像是 2 5 层设计 我更喜欢使用存储过程将数据层几乎完全移动到数据库中 并且在代
  • 通过 Javascript 不断查询服务器 - 好主意吗?

    我有一个小型网站 大约有 5 到 10 名管理员 我已将其设置为监视每个管理员正在执行的操作 添加项目 删除项目等 我的管理面板中有一个列表 显示了集体管理部门之前执行的 10 项活动 今天 我决定每 30 秒进行一次自我更新 我的问题很简
  • 使用默认值压缩而不是删除值?

    我正在 haskell 中寻找一个函数来压缩两个长度可能不同的列表 我能找到的所有 zip 函数都只是删除列表中比其他列表长的所有值 例如 在我的练习中 我有两个示例列表 如果第一个比第二个短 我必须用 0 填充 否则我必须使用 1 我不允
  • 从函数返回随机值是副作用吗?

    我当时正在编写一些 F 代码 并且正在编写一个从一组字符串中返回随机字符串的函数 假设我有这样的事情 open System let a a b c d let rstring arr string let r new Random arr
  • 领域驱动设计和工厂类的作用

    我不清楚工厂类的角色和职责是什么 我知道工厂类应该负责创建域对象 聚合根 及其关联的实体和值对象 但我不清楚 DDD 架构的工厂 层 在哪里 工厂应该直接调用存储库来获取其数据还是服务库 工厂在以下框架中的位置 UI gt 应用程序 gt
  • 需要澄清令人困惑的 Http4s 消息类型 `Response[F]` / `Request[F]`

    我很难理解为什么Request and Response参数化为F 类似的东西是猫效应数据类型资源 从文档中 https typelevel org cats effect docs std resource https typelevel

随机推荐

  • 可能有类似 Autoit 的 JavaScript 宏吗?

    标题说明了一切 有没有办法在 JavaScript 中编写宏来实现与 Autoit 类似的功能 我只是想在我自己的计算机上 离线 操作文件 并且可以使用 autoit 轻松完成 但由于我目前正在学习 JavaScript 计划在 Node
  • 您可以在不使用 Storyboard 的情况下在 AutoLayout 控制台输出中标记视图吗?

    我正在观看有关 AutoLayout 的 WWDC 演讲 并且了解到在视图上设置 StoryboardID 可以使约束冲突的控制台输出更易于阅读 即 您得到一个名称而不仅仅是一个地址 他们向您展示了在 Interface Builder 中
  • 使用 Jest + Enzyme 测试 amplify Auth

    我对测试非常陌生 我终于觉得我已经掌握了它的窍门 然而 模拟仍然有点令人困惑 我目前正在测试注册功能 该功能执行到Auth signUp 我不确定是否需要在测试中模拟某些内容 或者是否需要它来运行不同的测试 async function s
  • 在 3D 图中绘制所有三个轴上的分布轮廓

    我在三维空间中有一个点云 并估计了这些点的一些分布 也在 3D 空间中 使用核密度估计 http docs scipy org doc scipy reference generated scipy stats gaussian kde h
  • 左循环 numpy 数组的最快方法(如弹出、推送队列)

    对于 numpy 数组 我想执行此操作 move x 1 x n 1 to x 0 x n 2 左移 在最后一个索引中写入新值 x n 1 newvalue 这类似于一个pop push newvalue 对于先进后出队列 仅倒置 一个简单
  • 具有两种类型标志的表上的 Laravel 关系

    我有两张桌子 products and users 这两个对象在表中都有与其关联的图像 images 图像表的架构是 编号 图像ID 资源 ID 旗帜 1 567575 1 用户 2 423423 423423 1 产品 根据这个标志 我正
  • 当视图再次出现时 RightBarButtonItem 消失

    我的问题是我的导航项中的 RightBarButtonItem 在视图第二次出现后消失 第一次加载视图时 它会正确显示 但第二次它会完全消失 该按钮在 viewWillAppear 中初始化 如下所示 UIBarButtonItem opt
  • Express.js 4 - 在静态文件之前使用中间件进行身份验证

    In my express我已经设置了要从应用程序提供的静态文件 public包含此行的目录 app use express static dirname public 现在 我需要在提供静态内容之前添加一个用于身份验证的中间件 并且如果用
  • 在哪里测试用 SPARQL 编写的 RDF 的查询

    我是语义网技术的初学者 我的问题可能是一个非常基本的问题 但我真的很难弄清楚 我有一个从 XML 创建的 RDF 文件 并使用 w3 org RDF VALIDATOR 对其进行了验证 我的问题是如何使用 SPARQL 对 RDF 文档运行
  • 将 HTML 代码作为甜蜜警报的文本传递

    我在用this https sweetalert js org 在我的应用程序中 我想使用如下所示的甜蜜警报 swal title Are you sure text You are going to delete b name b add
  • 如何在 std::string 和 Aws::String 之间进行转换?

    当尝试转换std string to an Aws String使用以下代码 std string s Johnny is cool Aws String aws s s 我收到以下错误 error no matching function
  • clang_complete:iOS 的 Vim 自动补全

    所以最近我一直在尝试建立一个基于Vim的iOS工作流程 我找到了 clang complete 并在我的 vimrc 中设置了 clang 用户选项 如下所示 let g clang user options fblocks isysroo
  • 如何推迟/推迟 f 字符串的评估?

    我正在使用模板字符串生成一些文件 并且我喜欢为此目的而使用的新 f 字符串的简洁性 以减少我以前的模板代码 如下所示 template a The current name is name names foo bar for name in
  • 如何避免 NumPy 中的“RuntimeWarning:除法中遇到无效值”?

    我试图避免警告RuntimeWarning invalid value encountered in divide在 NumPy 中 我想我可以这样做 import numpy as np A np array 0 0 print A dt
  • 迭代“std::multiset”的独特元素

    我所需要的只是知道某物是否存在以及它存在了多少次 我将迭代现有的事物并查询其中存在多少 到目前为止我的实现使用multiset 我这样做 std multiset
  • 附加到正在运行的进程的探查器?

    我需要一个适用于 Windows 和 Linux 的良好分析器 它们不必是同一个 针对每个操作系统的单独建议都可以 它可以附加到未以任何 特殊 方式编译的已运行进程 并给出我对进程花费大部分时间的函数进行统计 我有一些长时间运行的科学代码
  • 如何通过引用获取对象的大小?

    假设我有一堂课 class Foo 我还有另一个功能 void getf Foo f std cout lt
  • Facebook 点赞按钮 - 隐藏计数?

    In the 设置对话框 http developers facebook com docs reference plugins like对于 Like Button 布局只有两种选择 替代方案1 https web archive org
  • redux框架wordpress调用变量

    我已经通过 wordpress 安装了 redux 插件 非常棒 我一直在使用demo内容来熟悉框架 但我不知道如何调用模板中的数据 我已经使用选项树很长时间了 并发现了这一点 这是我认为正确的呼唤 但我想不是 这是我认为可以上传徽标的代码
  • 策略模式的功能类比是什么?

    免责声明 我不使用函数式语言 只是试图理解 FP 的某些部分 Google 建议使用 lambda 的一阶函数可以提供与策略模式提供的类似功能的文章 然而我们需要以某种方式匹配数据和相应的 lambda 通过 OO 设计 这是自动完成的虚拟