gpt4 book ai didi

design-patterns - 过滤项目集合的设计模式?

转载 作者:行者123 更新时间:2023-12-03 20:53:03 25 4
gpt4 key购买 nike

想象一下典型的应用程序类型,其中您有一个具有不同属性的项目列表。例如。一个包含 100 个项目的 TreeView ,每个项目都有一个名称、一个评级、一个在地球上 HitTest 门的项目中的排名等。项目和项目目录之间可能还有多对多的关系,或在项目和项目创建者等之间。

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

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

任何人?

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

最佳答案

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

  • 过滤后底层集合应该不变
  • 结果不持久

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

    在集合上, View 通常使用 实现。迭代器 ,并且对于过滤,当然是已经指出的策略模式。

    例如:
    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,也保证您的 View 会更新。 ,尽管这可能会影响迭代器的有效性(像往常一样)。

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

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

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

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

    关于design-patterns - 过滤项目集合的设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1622474/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com