要想写好一个功能,哪怕这个功能很简单,也要考虑到扩展性。
最好的学习路线是从具体到抽象,而最好的设计思路是从抽象到具体。
一、抽象输入输出
对于一个功能,使用者只需要关心输入和输出即可。
分页查询
输入:
页码和每页的记录条数(必需)
排序规则(非必需)
查询条件(非必需)
输出:
记录集合
记录总条数
总页数
由此可设计出两个类,分别对应分页操作的输入和输出
PageReqeust:
/**
* Created by liuruijie on 2017/4/6.
* 分页查询的相关参数封装
*/
public class PageRequest {
private int size; //查询记录的数量
private Sort[] sorts; //排序
private int start; //开始位置
//page为页码
public PageRequest(int page, int size, Sort... sorts) {
this.size = size;
this.sorts = sorts;
this.start = (page-1)*size;
}
public static class Sort {
private String type;
private String field;
public Sort(String field) {
this.field = field;
type = "ASC";
}
public Sort(String field, String type) {
this.field = field;
this.type = type;
}
···
}
//省略set和get方法
···
}
该类封装了分页查询的页码和页面大小,还有排序规则。对于查询条件,由于其需要由具体的实体和具体的业务才能确定,所以不方便在这里封装。
Page:
/**
* Created by liuruijie on 2017/4/6.
* 分页查询的返回值
*/
public class Page {
private long totalRows; //总记录数
private int totalPages; //总页数
private List rows; //查询到的记录
//省略set和get方法
···
}
该类封装了分页查询需要的结果。
到现在,分页的输入和输出都定义好了,需要进行过程的实现。
二、定义接口规范
同样的,先抽象分页操作
/**
* Created by liuruijie on 2017/4/17.
* 提供基础的分页接口
*/
public interface