用于过滤项目集合的设计模式?

2024-02-21

想象一下典型的应用程序类型,其中您有一个具有不同属性的项目列表。例如。包含 100 个项目的树视图,每个项目都有一个name, a rating, a 全球最热门商品排名等等。之间可能也存在多对多的关系items and 项目目录,或之间items and 物品创造者等等等等

现在这个应用自然需要一个过滤系统。例如。我可以在不同关系的数据之间构建具有各种多种条件的复杂过滤器。

编写这样一个过滤功能的设计任务应该是许多开发人员都做过的事情,并且肯定必须有某种最适合该任务的设计模式。

Anyone?

Edit:切换到社区维基,因为我怀疑没有任何行业事实模式用于此。我想问题太笼统了。


实际指出你想要什么有点困难,所以我会采取我自己的假设。

  1. 过滤后底层集合应该保持不变
  2. 结果不持久

一个经典的方法是使用views。这基本上是惰性编程,您可以在其中创建一个对象,该对象可以访问原始集合并知道要应用的过滤器,但只要不需要任何计算,就不会进行任何计算。

在集合上,视图通常通过以下方式实现迭代器,对于过滤,当然是已经指出的策略模式。

例如:

Collection myCollection;
Predicate myFilter;

// Nothing is computed here
View<Predicate> myView(myCollection, myFilter);

// We iterate until we find the first item in the collection that satisfies
// the Predicate, and no more, to initialize `begin`
View<Predicate>::Iterator begin = myView.begin(), end = myView.end();

净优势是,如果您(比如说)只需要前 10 个项目,那么您只需应用谓词来查找前 10 个项目,而不再需要更多。

而且,所涉及的元素没有副本,即使您修改,您的视图也保证会更新myCollection,尽管这可能会影响迭代器的有效性(像往常一样)。

问题是(除非您实现缓存),每次都会计算结果。

如果您想要更持久的结果,那么您最好构建一个仅包含过滤项(或对它们的引用)的新集合。这里没有通用模式,因为它取决于您想要如何使用“过滤”列表。

至于建议的策略模式,您通常可以使用复合模式按块构建过滤器,然后将构建的对象作为策略传递。

复合模式特别适合表示解析表达式的结果,例如,您可能想查看表达式树以获得一个想法。

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

用于过滤项目集合的设计模式? 的相关文章

  • 向项目添加资源的设计

    我有课Project Resource and File where A Project包含列表资源 Each Resource包含以下列表Files特定类型的 这被映射到 XML
  • 实体框架的状态模式

    我有一个模型Enquiry 它可以处于两种状态之一 还有更多状态 但出于此目的 我将仅比较两种状态 New and Closed 查询所处的状态取决于用户能够对查询执行什么操作 例如 无法删除已关闭的查询 而可以删除新的查询等等 基本示例
  • 列表有简短的 contains 函数吗?

    给定一个列表xs和一个值item 如何检查是否xs包含item 即 如果任何元素xs等于item 有没有类似的东西xs contains item For performance considerations see Fastest way
  • 这是一个不正确的警告吗?

    让我们看看我经常看到的这个代码模式 struct Foo template
  • 为什么要分离接口和实现?

    在生产代码中 我经常看到定义如下的类 public interface SomeComponent Some methods public class SomeComponentImpl implements SomeComponent S
  • 是否有用于序列化和反序列化各种格式的对象层次结构的模式?

    给定一个复杂的对象层次结构 幸运的是它不包含循环引用 如何实现支持各种格式的序列化 我不是来讨论实际实施的 相反 我正在寻找可能派上用场的设计模式的提示 更准确地说 我正在使用 Ruby 我想解析 XML 和 JSON 数据以构建复杂的对象
  • 策略模式的现实示例

    我一直在读关于OCP原理 http en wikipedia org wiki Open closed principle以及如何使用策略模式来实现这一目标 我打算尝试向几个人解释这一点 但我能想到的唯一例子是根据 订单 的状态使用不同的验
  • 如何在无 null 设计中实现 List、Set 和 Map?

    当您在大多数情况下可以返回 null 空对象以避免 null 时 这很好 但是像 Collection 这样的对象呢 在爪哇 Map回报null if key in get key 地图上没有找到 我能想到的最好的避免方法null在这种情况
  • 用简单的英语来说,什么是单例?

    我已经在谷歌上搜索了大约一个小时 但我仍然不清楚什么是单例 谁能让我更清楚一点 也许可以发布一个代码示例 我所知道的是 一个给定类只能有一个实例 但是你不能为此使用静态类吗 提前致谢 The simple plain English1 ve
  • 就MVC模式而言,Struts 2中使用的Action是什么?

    在Struts2中 控制器将请求分派给Action Action将其传递给后端逻辑 这可以看作是一个非常大的过程 model 处理请求 JSP代表视图 Struts2中如何定义Action 肯定是not一个看法 是控制器还是模型 Strut
  • 实施策略模式的函数式方法

    我正在尝试解决一个处理从一种温度单位到另一种温度单位 摄氏度 开尔文 华氏度 转换的问题 在Java中 我需要创建一个接口并提供多个实现来封装输入类型并将结果作为输出类型的单元返回 例如开尔文到摄氏度或摄氏度到华氏度等 我已经在 scala
  • 服务层或存储库中的密码哈希等?

    作为 MVC 的最佳实践 在发送到数据库之前处理密码散列 加盐或数据格式化等事务的逻辑应该放在哪里 我读到存储库应该仅用于处理数据访问的逻辑 这是属于服务层的东西吗 控制器 这还重要吗 我倾向于将散列放在存储库层中 如果只是出于实际原因 即
  • 如何简化 ASP.NET MVC 中的全状态交错模式对话框

    我需要在多对多模式对话框中保留状态渐进增强 http en wikipedia org wiki Progressive enhancementASP NET MVC 项目中的方式 在我的代码中 当禁用 javascript 时 模式对话框
  • 通过另一个二维数组中的行过滤二维数组的行

    我有两个数组 我正在使用array diff assoc 以获得差异 但它总是返回common set结果中的行 它应该返回new q sets排 我的方法有什么问题吗 样本数据 array1 12 gt new q sets 11 gt
  • 在流星收集加载时显示加载程序

    我有一个模板 task list 看起来像这样 each tasks gt task each Template task list tasks返回一个集合 在用户界面中 加载似乎需要一些时间 当集合正在加载时 我想显示一个加载指示器 关于
  • Java API 中单例类的示例

    Java API 中单例设计模式的最佳示例有哪些 是个Runtime类单例 我只想到两个例子 java lang Runtime getRuntime http java sun com javase 6 docs api java lan
  • 以相反的顺序打印任何集合中的项目?

    我在 使用 Java 进行数据结构和问题解决 一书中遇到以下问题 编写一个例程 使用 Collections API 以相反的顺序打印任何 Collection 中的项目 不要使用 ListIterator 我不会把它放在这里 因为我想让有
  • iostream 对象 cin、cout、cerr 和 clog 是如何实现的?

    iostream 对象 cin cout cerr 和 clog 是在 iostream 标头中声明的对象 我知道在某些编译器中可能会在构造这些 iostream 对象之前尝试使用它们 因此在某些情况下它们必须受到 静态初始化顺序失败 的影
  • Joshua Bloch 的构建器设计模式有何改进?

    早在 2007 年 我就读过一篇关于 Joshua Blochs 所采用的 构建器模式 的文章 以及如何修改它以改善构造函数和 setter 的过度使用 特别是当对象具有大量属性 其中大部分属性是可选的 时 本文对此设计模式进行了简要总结
  • 如何检查某个元素是否存在于一组项目中?

    In an ifJava中的语句如何检查一个对象是否存在于一组项目中 例如 在这种情况下 我需要验证水果是苹果 橙子还是香蕉 if fruitname in APPLE ORANGES GRAPES Do something 这是一件非常微

随机推荐

  • jenkins pipelines:shell脚本无法获取更新的环境变量

    在 Jenkins 中 我想获取用户输入并传递给 shell 脚本以供进一步使用 我尝试设置为环境变量 但shell脚本无法获取最新值 旧值是echo pipeline agent none environment myVar someth
  • Rails 中按月和年对记录进行分组

    我使用的是 Ruby 1 9 2 Rails 3 0 x 并且使用 MySQL DB 我有一个消息模型 每天都可以发布新消息 我有一个索引操作 我想在其中显示按月份和年份分组的这些消息 这主要用于过滤消息 我的查询如下所示 active m
  • 我实际上如何从方法外部获取异步 Web 请求的响应?

    我有点困惑 我正在尝试以异步方式发布到我的网络服务 理想情况下我想启动请求 在 UI 上显示加载微调器 然后当异步请求完成时处理响应 并且如果有错误则显示错误 或对结果进行其他操作 这是我的代码 我在这里调用请求并传递一些数据 privat
  • md5 目录树中的所有文件

    我有一个结构如下的目录 Test txt Test1 Test1 txt Test1 copy txt Test1a Test1a txt Test1a copy txt Test2 Test2 txt Test2 copy txt Tes
  • 如何在qsub中指定错误日志文件和输出文件

    我有一个 qsub 脚本 submit job sh bin sh N job1 t 1 100 cwd SEEDFILE home user1 data1 SEED sed n e SGE TASK ID p SEEDFILE home
  • 如何在 CloudFormation 中指定签名的 S3 URL 作为模板?

    在 AWS CloudFormation 中 您可以通过上传模板文件或指定模板的 S3 URL 来指定模板 指定 Amazon S3 模板 URL 如果存储桶是公共的 您可以构造一个 URL 供任何人访问该对象 模板 只要 S3 模板 UR
  • Ellipsize 属性在 Android 4.0 上不起作用

    我目前正在 Android 4 0 Ice Cream Sandwich 上测试一个应用程序 然后再向市场发布更新 在测试过程中 我意识到椭圆形属性停止工作 我在列表视图上使用它来截断太长的项目标题 在 Android 2 3 7 上 一切
  • oracle中的子选择

    我正在尝试从子选择中的另一个表中选择最新价格 但我不知道如何让它发挥作用 这是我尝试过的 select something somthingelse select from select QUOTE PRICE as old price f
  • Android Firebase:无法解析

    我尝试将 Firebase 与我的应用程序连接 但出现了此错误 这是我的 build gradle 项目 Top level build file where you can add configuration options common
  • createReadStream() 抛出 RangeError:上传文件时超出最大调用堆栈大小

    我正在尝试使用 Apollo 服务器Upload直接将文件发送到 S3 的标量 我的架构 const gql require apollo server express module exports gql extend type Muta
  • Python:使用“copyreg”为已有减速器的类型定义减速器

    请记住 我正在使用 Python 3 工作 因此解决方案需要在 Python 3 中工作 我想使用copyreg教 Python 如何 pickle 函数的模块 当我尝试这样做时 Pickler对象仍然会尝试使用 pickle 函数save
  • NSURLSessionConfiguration 和 NSURLRequest 具有相同的属性吗?

    我在官方文档中看到 NSURLSessionConfiguration 和 NSURLRequest 共享一些相同或相似的属性 比如NSURLRequestCachePolicy networkServiceType timeOurInte
  • 在具有属性的两个表单之间传递数据[重复]

    这个问题在这里已经有答案了 我正在 C 中的 2 个窗口窗体之间传递数据 Form1 是主窗体 其文本框将接收从 form2 textbox 传递给它的文本并将其显示在其文本框 form1 textbox 中 首先 form1 打开 带有一
  • React 测试库 - 在 fireEvent 之后使用“await wait()”

    我正在尝试使用测试库在 fireEvent click 之后检查 DOM 元素 我知道我需要在 fireEvent 之后等待 但不确定为什么简单地使用 wait 不起作用 下面是以两种方式编写的相同测试 第一个失败 第二个通过 我不明白为什
  • .htaccess 将index.php重定向到/

    我想隐藏index php页面并只显示域 htaccess 可以吗 RewriteRule index php L R 301 NC 还尝试过 RewriteEngine On RewriteBase RewriteCond THE REQ
  • 导航抽屉未正确显示

    我正在开发新闻应用程序 并且已经实现了导航抽屉 使用以下link https guides codepath com android fragment navigation drawer但是当我运行代码应用程序时显示空白色 屏幕 在我的 M
  • 附加选项以选择菜单?

    使用 Javascript 如何将选项附加到 HTML 选择菜单 例如
  • 使用任务时如何使用上一个任务的结果继续另一个函数?

    我有 WCF 连接器 它应该为我获取一些少量的数据 通常需要 20 秒才能获取每个项目的数据 这很好 我想使用任务为我获取数据 然后添加具有此任务值的 WinForm 控件 我已经创建了包含这些数据的对象列表 使用第一个任务作为更新列表的任
  • 如何在graphviz中强制Y坐标

    有没有办法在 graphviz 中使用 dot force y 位置 以像素或英寸为单位 The rank same不适合我的情况 The pos x y with Kfdp可能是一种方法 但我想让 GraphViz 确定 X位置 Than
  • 用于过滤项目集合的设计模式?

    想象一下典型的应用程序类型 其中您有一个具有不同属性的项目列表 例如 包含 100 个项目的树视图 每个项目都有一个name a rating a 全球最热门商品排名等等 之间可能也存在多对多的关系items and 项目目录 或之间ite