是否有使集合类可分页的通用设计模式?

Posted

技术标签:

【中文标题】是否有使集合类可分页的通用设计模式?【英文标题】:Is there a common design pattern for making a collection class page-able? 【发布时间】:2010-01-11 20:24:09 【问题描述】:

我多次遇到这个设计问题,想知道是否有一个通用的 OOP 设计模式可以解决这个问题。

设计问题:我需要实现一个类来表示可以变得非常大的对象集合。出于性能原因,当用户浏览数据时,表示层将在单个页面中显示数据,一次只请求一小部分对象。理想情况下,该对象还可以根据需要选择性地查询数据库,而不是将所有内容预加载到内存中,因为对于非常大的集合,客户端/用户很可能永远不会请求集合中的所有数据。

我已经通过多种方式实现了这一点,但没有一种感觉非常模块化、干净,或者具有真正直观的界面。

是否存在用于实现对象的通用 OOP 设计模式,该模式允许客户端一次提取一页数据,并且仅根据需要从数据层查询数据?

【问题讨论】:

听起来你想要一个迭代器变体。 【参考方案1】:

我将扩展(或创建)一个 Iterator 类并添加一个构造函数参数,该参数指定每页的项目数,并添加一个 nextPage() 方法,该方法返回一个适当大小的集合(如果没有足够大小,则更少填满一页的项目)。

另一个选择是简单地扩展或创建一个 Iterator 类并创建一个 nextPage() 方法,该方法接受一个整数,该整数是页面上应该存在的最大项目数,返回一个适当大小或更小的集合。

迭代器模式在 GoF 书籍中,如果您需要参考。

【讨论】:

【参考方案2】:

如果您想一次只从数据库中获取一个页面,那么这可以作为数据库模式来完成。无论是在数据库中实现还是在访问层实现,都需要知道: 项目总数、页面大小、正在请求的页面。

然后代码需要为所有项目创建一个完整的可索引(它具有项目编号)键值列表,根据需要或指定进行排序,然后仅返回那些具有将它们放入索引的项目的所有数据请求的页面。

例如,在 SQL Server 中(具有适当的索引),您可以在单个存储过程中使用 Table 变量来保存排序的键列表,并非常快速地返回任何数据页

【讨论】:

对不起,如果我不清楚。当我提到它很大时,我说的是逻辑数据模型,而不是实际的实现。 IE。集合类代表了很多项目。

以上是关于是否有使集合类可分页的通用设计模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有可分页的 mongorepository 修复转换错误

通用分页的编写

JAVA WEB 分页

如何使 saveAll 结果返回可分页?

避免嵌套分页的模式设计

java分页通用篇