设计模式的艺术 第十九章迭代器设计模式练习(设计一个逐页迭代器,每次可返回指定个数(一页)元素,并将该迭代器用于对数据进行分页处理)
作者:代廉洁
- 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 加入
还未添加个人简介
评论