写点什么

设计模式的艺术 第十九章迭代器设计模式练习(设计一个逐页迭代器,每次可返回指定个数(一页)元素,并将该迭代器用于对数据进行分页处理)

作者:代廉洁
  • 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
用户头像

代廉洁

关注

还未添加个人签名 2019.10.15 加入

还未添加个人简介

评论

发布
暂无评论
设计模式的艺术 第十九章迭代器设计模式练习(设计一个逐页迭代器,每次可返回指定个数(一页)元素,并将该迭代器用于对数据进行分页处理)_设计模式的艺术_代廉洁_InfoQ写作社区