代码之家  ›  专栏  ›  技术社区  ›  sharkin

筛选项目集合的设计模式?

  •  15
  • sharkin  · 技术社区  · 6 年前

    想象一下典型的应用程序类型,其中有一个具有不同属性的项列表。例如,有100个项目的树视图,每个项目都有 名称 A 评级 ,A 在这个星球上最热门的物品中排名 可能还有很多关系 项目 项目目录 ,或两者之间 项目 项目创建者

    现在这个应用程序自然需要一个过滤系统。例如,在这里,我可以构造各种不同条件的复杂滤波器,在不同关系的数据之间。

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

    有人吗?

    编辑: 切换到社区wiki,因为我怀疑没有任何行业因素模式用于此。我想这个问题太笼统了。

    6 回复  |  直到 8 年前
        1
  •  6
  •   Matthieu M.    16 年前

    要真正指出你想要什么有点困难,所以我要做我自己的假设。

    1. 筛选后基础集合应保持不变
    2. 结果并不持久

    一个经典的方法是 意见 . 基本上 惰性编程 在其中创建一个对象,该对象可以访问原始集合并知道要应用的筛选器,但只要不需要任何内容就不进行任何计算。

    在集合中,视图通常使用 迭代器 ,对于过滤,当然是已经指出的策略模式。

    例如:

    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 ,尽管这可能会影响迭代器的有效性(与往常一样)。

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

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

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

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

        2
  •  1
  •   James Black    16 年前

    我不知道它的设计模式,但是你可以查看一些已经排序的方法,如果你解释其中的一些,为什么不喜欢它们,这将是一个有用的例子。

    例如,linq有一个很好的排序方法,使用表达式树。

    您还可以查看函数语言中的排序,在这里您可以传递函数来进行排序,而不是硬编码任何特定的排序。

    如果您使用的是类似javascript的东西,那么可以动态创建sort函数。

        3
  •  1
  •   Community CDub    8 年前

    我喜欢 用谓词筛选 属于 Google Collections 如果我不能使用它,我会实现一些非常相似的东西。你可能想查一下 this answer 对于一个实现示例来说是一个类似的问题。该实现是在Java中实现的,但是,您将看到该模式。

        4
  •  1
  •   John Ellinwood    16 年前

    您在寻找关系数据库,从中可以使用SQL。您可以站满一个并从应用程序连接到它,或者在完整数据库和直接对象之间做一些事情。例如,在Java中,可以使用像HQLDB/JavaDB的内存数据库,并使用它的特性。你也可以用 JoSQL 这将允许您在sql中直接对对象进行操作,而不必使用数据库。

    或者,如果你想自己编程,你可以先保存两份数据。一个是完整的数据集,另一个是过滤后的数据视图。然后,通过对数据进行排序并保持其在排序列表中的位置,为每一列的数据创建索引。相同的设置适用于筛选器匹配。如果某个内容与列的筛选器匹配,则为其指定1,否则为0。然后,当有人切换排序顺序时,您将数据从完整列表复制到视图列表中,或者当更改筛选器信息时,您将只获取具有匹配项的数据。

        5
  •  0
  •   peter.murray.rust    16 年前

    如果这些关系可以表示为RDF和OWL,则可以使用具有SPARQL端点(如耶拿)的工具或诸如粒料之类的推理器。但如果没有更多的细节,这是否是最好的方法还不清楚。

        6
  •  0
  •   Juan    12 年前

    看看是否 http://en.wikipedia.org/wiki/Criteria_Pattern 可以帮助你。 基于规范模式

    推荐文章