2010-01-11 106 views
1

我已经运行过这个设计问题很多次,并想知道是否有一个通用的OOP设计模式来解决它。是否有一个常见的设计模式可以使集合类成为可翻页的?

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

我已经实现了很多方法,但都不是很模块化,干净,或者有一个非常直观的界面。

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

+1

听起来像你想要一个迭代器变体。 – 2010-01-11 20:26:49

回答

4

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

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

如果您需要参考,则Iterator模式位于GoF书籍中。

1

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

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

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

+0

对不起,如果我不清楚。当我提到它很大时,我说的是逻辑数据模型,而不是实际的实现。即收集类表示很多项目。 – JohnFx 2010-01-11 20:47:34

相关问题