数据分页显示是一项挺烦人的工作,涉及到数据来源,数据生成,数据显示这几个方面。数据有可能是从任意地方以任意方式获取到的,而且获取到的数据又有可能是经过了任意的方式处理之后,再以任意的方式显示给最终用户。
这其中的一连串的“任意”就已经足够让人头疼了,我们现在要做的就是做出一个能一劳永逸的解决这一连串的问题的关于分页问题的设计。
首先要明确的就是:这只是一个关于解决分页问题的设计思想,不会提供一份具体实现这个设计的代码。
在开始之前,我们要先做一个假设:对数据分页的最终显示部分已经有具体的解决方案,并对其中的部分代码做一些改造,使其可以接受实现了IView接口的对象。
一、我们需要如下的接口:
* 数据整理接口,
* 将从数据来源中获取到的数据进行重新处理,
* 得到一个新的数据集
*
*
*/
public interface IMakeUpRecord {
/**
* 将从数据来源中获取到的数据进行重新处理,
* 得到一个新的数据集
* @param records 从数据来源中获取的初始数据
*/
public void do(String[][] records);
}
* 与数据分页显示的具体实现部分的接口
*
*
*/
public interface IView {
/**
* 设置HttpServletRequest
*
*/
public void setRequest(HttpServletRequest request);
/**
* 获取HttpServletRequest
*
*/
public HttpServletRequest getRequest();
/**
* 获取当前请求页码
*
*/
public int getNowPage();
/**
* 获取每一页需要显示多少条记录
*
*/
public int getPageRow();
/**
* 获取总记录条数
*
*/
public int getCount();
/**
* 根据当前页码和每一页需要显示的记录数获取当前页所有记录
*
* @param nowPage 当前页码
* @param pageRow 每一页需要显示的记录数
*
* @return String[][]
* 当前页的所有记录,数组对应的是记录的行和列
*/
public String[][] getRecords(int nowPage,int pageRow);
/**
* 将从数据来源中获取到的数据进行重新处理,得到一个新的数据集
*
* @param makeUpRecord数据整理接口
* @param records从数据来源中获取的当前页的初始数据
*
*/
public void makeUpRecords(String[][] records);
/**
* 在这个方法中进行所有方法的组合操作,返回给最终显示部分使用,
* 返回的对象类型应该结合已经存在的具体的数据分页显示部分的代码
*
*/
public String createTable();
//其它方法
……
}
二、针对 IView 并结合已经存在的具体的数据分页显示部分的代码实现的一个抽象类
/**
* 设置HttpServletRequest
*
*/
public void setRequest(HttpServletRequest request){
//具体实现
}
/**
* 获取HttpServletRequest
*
*/
public HttpServletRequest getRequest(){
//具体实现
}
public IMakeUpRecord getMakeUpRecord(){
//具体实现
}
/**
* 获取当前请求页码
*
*/
public int getNowPage(){
//具体实现
}
/**
* 获取每一页需要显示多少条记录
*
*/
public int getPageRow(){
//具体实现
}
/**
* 获取总记录条数
* 由模板实现类进行具体的实现
*
*/
public abstract int getCount();
/**
* 根据当前页码和每一页需要显示的记录数获取当前页所有记录
* 由模板实现类进行具体的实现
*
* @param nowPage 当前页码
* @param pageRow 每一页需要显示的记录数
*
* @return String[][]
* 当前页的所有记录,数组对应的是记录的行和列
*/
public abstract String[][] getRecords(int nowPage,int pageRow);
/**
* 将从数据来源中获取到的数据进行重新处理,得到一个新的数据集
*
* @param makeUpRecord数据整理接口
* @param records从数据来源中获取的当前页的初始数据
*
*/
public void makeUpRecords(String[][] records){
IMakeUpRecord makeUpRecord= getMakeUpRecord();
if(makeUpRecord!=null){
makeUpRecord.do(records);
}
}
/**
* 在这个方法中进行所有方法的组合操作,返回给最终显示部分使用,
* 返回的对象类型应该结合已经存在的具体的数据分页显示部分的代码
*
*
*/
public String createTable(){
//其它操作
……
String[][] records= makeUpRecords(getRecords(getNowPage(),getPageRow()));
//其它操作
……
}
//其它方法
……
}
三、按照具体的数据来源方式实现AbstractViewTemplate抽象类
2 /**
3 * 获取总记录条数
4 *
5 */
6 public int getCount(){
7 //具体实现,
8 //可以是通过数据库中获取数据总数,
9 //或从内存中获取数据总数,
10 //或者从XML中获取数据总数
11 }
12
13 /**
14 * 根据当前页码和每一页需要显示的记录数获取当前页所有记录
15 *
16 * @param nowPage 当前页码
17 * @param pageRow 每一页需要显示的记录数
18 *
19 * @return String[][]
20 * 当前页的所有记录,数组对应的是记录的行和列
21 */
22 public String[][] getRecords(int nowPage,int pageRow){
23 //具体实现,
24
25 //可以是通过数据库中获取数据,jdbc方式,hibernate方式,或ibatis方式
26
27 //或从内存中获取数据,数组或list或map
28
29 //或者从XML中获取数据
30 }
31
32 }
33
四、整体部分的结构如下所示
数显示部分的具体实现_3 à IView |à AbstractViewTemplate_3
数据显示部分的具体实现_2 à IView |à AbstractViewTemplate_2
数据显示部分的具体实现_1 à IView |à AbstractViewTemplate_1
数据显示部分的具体实现 à IView |à AbstractViewTemplate|àViewTemplate_3
|à ViewTemplate_2
|à ViewTemplate_1
|à ViewTemplate
这样就通过策略模式和模板模式的结合,将数据显示、数据生成、数据来源三部分完全分开,并做到了重用和简化开发。
每种数据显示部分的具体实现,只需要实现一个针对其实现的AbstractViewTemplate抽象类即可。在之后的具体的业务开发过程中,关系的只是ViewTemplate部分中的两个方法, 只需要针对业务的具体需求,继承AbstractViewTemplate实现一个类似ViewTemplate的类即可。最终在AbstractViewTemplate中通过createTable()方法将展现所需要的数据传送给数据显示部分。
snoics