设计模式的艺术 第十九章迭代器设计模式练习(设计一个逐页迭代器,每次可返回指定个数(一页)元素,并将该迭代器用于对数据进行分页处理)
作者:代廉洁
- 2022 年 9 月 05 日 浙江
本文字数:2242 字
阅读完需:约 7 分钟
设计一个逐页迭代器,每次可以返回指定个数(一页)元素,并将该迭代器用于对数据进行分页处理。试使用迭代器模式设计该系统。
一、类结构图
二、典型实现代码
抽象分页迭代器类:抽象迭代器类
// 抽象分页迭代器类:抽象迭代器类public abstract class PageIterator { public abstract void previousPage(); public abstract void nextPage(); public abstract Boolean isFirstPage(); public abstract Boolean isLastPage(); public abstract List<Object> getPreviousPage(); public abstract List<Object> getNextPage();}复制代码
抽象对象列表类:抽象聚合类
// 抽象对象列表类:抽象聚合类public abstract class AbstractObjectList { private List<Object> objectList;
public AbstractObjectList(List<Object> objects) { this.objectList = objects; }
public void addObject(Object object) { this.objectList.add(object); }
public void removeObject(Object object) { this.objectList.remove(object); }
public List<Object> getObjects() { return objectList; }
public abstract PageIterator createPageIterator();}复制代码
具体分页迭代器类:具体迭代器类
// 具体分页迭代器类:具体迭代器类public class ConcretePageIterator extends PageIterator { private AbstractObjectList abstractObjectList; private List<Object> objectList; private List<List<Object>> objectListPages; private Integer cursor; private Integer reversalCursor; private Integer totalPage;
public ConcretePageIterator(AbstractObjectList list, Integer pageSize) { this.abstractObjectList = list; this.objectList = abstractObjectList.getObjects(); this.totalPage = (int) Math.ceil((((double) this.objectList.size() + (double) pageSize) / (double) pageSize - 1)); this.cursor = 0; this.reversalCursor = this.totalPage - 1; this.objectListPages = new ArrayList<>(); for (int i = 0; i < this.totalPage; i++) { List<Object> objList = new ArrayList<>(); for (int j = 0; j < pageSize; j++) { if (i * pageSize + j > this.objectList.size() -1) { break; } objList.add(this.objectList.get(i*pageSize + j)); } objectListPages.add(objList); } }
@Override public void previousPage() { if (this.reversalCursor > -1) { this.reversalCursor--; } }
@Override public void nextPage() { if (this.cursor < this.totalPage) { this.cursor++; } }
@Override public Boolean isFirstPage() { return reversalCursor == -1; }
@Override public Boolean isLastPage() { return cursor.equals(this.totalPage); }
@Override public List<Object> getPreviousPage() { return this.objectListPages.get(reversalCursor); }
@Override public List<Object> getNextPage() { return this.objectListPages.get(cursor); }}复制代码
具体对象列表类:具体聚合类
// 具体对象列表类:具体聚合类public class ConcreteObjectList extends AbstractObjectList{
public ConcreteObjectList(List<Object> objects) { super(objects); }
@Override public PageIterator createPageIterator() { return new ConcretePageIterator(this, 5); }}复制代码
客户端代码:
public class Client { public static void main(String[] args) { AbstractObjectList concreteObjectList; PageIterator concretePageIterator; List<Object> objects = new ArrayList<Object>(); objects.add("ab"); objects.add("cd"); objects.add("ef"); objects.add("gh"); objects.add("ij"); objects.add("kl"); concreteObjectList = new ConcreteObjectList(objects); concretePageIterator = concreteObjectList.createPageIterator(); while (!concretePageIterator.isLastPage()) { System.out.println("下一页:"); List<Object> objPage = concretePageIterator.getNextPage(); System.out.println(objPage); concretePageIterator.nextPage(); } System.out.println(); while (!concretePageIterator.isFirstPage()) { System.out.println("上一页:"); List<Object> objPage = concretePageIterator.getPreviousPage(); System.out.println(objPage); concretePageIterator.previousPage(); } }}复制代码
编译并运行程序,输出如下结果:
下一页:[ab, cd, ef, gh, ij]下一页:[kl]
上一页:[kl]上一页:[ab, cd, ef, gh, ij]复制代码
划线
评论
复制
发布于: 刚刚阅读数: 6
版权声明: 本文为 InfoQ 作者【代廉洁】的原创文章。
原文链接:【http://xie.infoq.cn/article/1bbd3a23ba1c7c7c4d87b09a4】。文章转载请联系作者。
代廉洁
关注
还未添加个人签名 2019.10.15 加入
还未添加个人简介









评论