java模板方法在分页中的使用

本文介绍了一种通用模式,通过定义接口和抽象类,简化了数据集合处理和分页操作,使得代码复用性更强,易于维护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
    在日常的编程过程中,经常要处理数据集合。对数据集合处理一般采用下面的接口:
 
    /**     * 得到集合方法,传入当前页,和每页的大小     *      * @param curpage     * @param pagesize     * @return     */     public list<t> getlist(int curpage, int pagesize)
 
上面的处理过程,即大家通常所说的分页;一般显示的时候,使用上面的方法就可以了,但是,如果要对集合中的全部数据处理呢?一般情况下,会出现下面的代码:
 
	int curpage = 1;	int pagesize = 100;	int count = xxxservice.getxxxcount();	int lastpage = count / pagesize + 1;	while (lastpage >= curpage) {	    list<xxxtype> lists = xxxxservice.getxxxxbyyyy(curpage,pagesize);	    if (lists == null) {	        break;	    }	    for (t obj : lists) {			//对其中的一个进行处理	    }	    curpage++;	}
 
那么,能不能把上面的代码变成一个通用的模式(工具),然后很简单的使用,不用每次都这样的重复呢?
 
让我们分析一下,上面情况下,什么是可变的,什么是不变的?
 
    1、总体的流程是不变的;
    2、得到当前页的list和对其中一个进行处理是可变的
 
分析到这里,可能很多人想到了模板方法类解决这个问题,在spring jdbc中大量使用了这种方法;具体实现时,有2种选择,一个是使用抽象来完成过程1,使用子类来完成过程2,典型如:jdk中inputstream,第二个,使用接口来完成过程2,使用类来完成过程1,如:thread和runable;
 
下面采用第二种方式来实现;首先定义接口:
 
public interface listaction<t> {    /**     * 得到集合方法     *      * @param curpage     * @param pagesize     * @return     * @throws exception     */    public list<t> getlist(int curpage, int pagesize) throws exception;    /**     * 处理一个对象     *      * @param t     * @throws exception     */    public void process(t t) throws exception;}
 
这个接口中,是分析中可变的部分。再来定义不可变的类:
 
public class overlistutil<t> {    private int curpage = 1;    private int pagesize = 100;    private int lastpage = 1;    public void overlist(int count, listaction<t> listation) throws exception {        lastpage = count / pagesize + 1;        while (lastpage >= curpage) {            list<t> lists = listation.getlist(curpage, pagesize);            for (t obj : lists) {                listation.process(obj);            }            curpage++;        }    }    /**     * 得到当前处理的页     *      * @return     */    public int getcurpage() {        return curpage;    }    public void setcurpage(int curpage) {        this.curpage = curpage;    }    public int getpagesize() {        return pagesize;    }    /**     * 是否是最后一页     *      * @return     */    public boolean islastpage() {        return curpage == lastpage;    }    /**     * 设置每页要处理的数量,默认100     *      * @param pagesize     */    public void setpagesize(int pagesize) {        this.pagesize = pagesize;    }}
 
这个类主要对不可变的部分进行抽象,即模板。
 
那么,怎么使用呢?和thread、runable的实现一样,下面是个例子:
 
        final int count = 5;        final overlistutil<string> olu = new overlistutil<string>();        olu.setpagesize(10);        olu.overlist(count, new listaction<string>() {            @override            public void process(string t) throws exception {                // 这里是主要处理逻辑                system.out.println("正在处理第" + olu.getcurpage() + "页");                system.out.println("names:" + t);            }            @override            public list<string> getlist(int curpage, int pagesize) throws exception {                // 这里一般情况下只需要简单的调用服务即可                list<string> names = getservicenames(curpage, pagesize);                return names;            }            // 下面这个模仿一个服务            private list<string> getservicenames(int curpage, int pagesize) {                list<string> names = new arraylist<string>();                int lenght = 1;                if (olu.islastpage()) {                    lenght = count - ((olu.getcurpage() - 1) * olu.getpagesize());                } else {                    lenght = olu.getpagesize();                }                for (int i = 0; i < lenght; i++) {                    string s = string.valueof(math.random() * 100);                    names.add(s);                }                return names;            }        });
 
那么为什么不把overlistutil的overlist 定义为static的呢?因为这里使用了泛型,参见泛型
 
 
呵呵,周五了,明天可以好好的玩玩了!祝大家周末愉快!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值