前言
最近在学习设计模式, 为了便于理解和记忆,故将学习过程中的一些心得和体会记录在此,一方面可以帮助记忆,另一方面便于分享自己的知识。 今天我学习的是迭代器模式,迭代器模式内容网上一大堆资料, 但是为什么要使用迭代器模式网上大部分是说可以方便遍历容器内容,隐藏一些实现细节啥的, 我们平时遍历写个for循环就OK了,也没必要写个迭代器, 为了便于理解迭代器的作用,我想了一个简单的分页功能(只是简单写了一些思路,没有具体实现)。 分页很类似于遍历,于是就有了此文。
迭代器
简单来说,迭代器的类图大概是这样子的
- 两个接口
一个是迭代接口定义迭代的基本方法, 另外一个是功能接口,用于创建迭代器。 分别为 Aggregate (iterator方法)Iterator(next(), hasNext()等) - 两个实现类
分别实现上面两个方法 create出具体的Iterator - 遍历内容
也就是具体的实体类
遍历的时候可以将数据存放到List中,也可以将数据存放到Array中,都可以实现遍历的方法,本文中严格意义上不算是遍历, next方法是从数据库中读取下一页数据,这跟网上的资料不太相同
代码
首先是Iterator接口
public interface Iterator<T> {
public T first();
public T next();
public boolean hasNext();
public T current();
}
然后是Aggregate接口
public interface Aggregate {
public <T> Iterator<T> iterator();
}
Iterator的实现类
public class PageIterator<T> implements Iterator<T> {
private int index = 0;
Service service = new Service();
@Override
public T first() {
return service.getDataFromMysql(0);
}
@Override
public T next() {
T t = null;
if(hasNext()) {
index++;
}
//如果hasNext为false, 返回当前页数据
t = service.getDataFromMysql(index);
return t;
}
@Override
public boolean hasNext() {
int total = service.getTotalDataFromMysql();
if(index < total)
return true;
return false;
}
@Override
public T current() {
T t = null;
t = service.getDataFromMysql(index);
return t;
}
}
Aggregate的实现类
public class Paginator implements Aggregate{
public <T>Iterator<T> iterator(){
return new PageIterator<T>();
}
}
Service方法
public class Service {
// 每页展示10条数据
private int pageNum = 10;
/**
* 从数据库中读取第1页的数据,返回一个List, T为List对象
* @param i
* @return
*/
public <T> T getDataFromMysql(int i) {
/**
* 从数据库中读取逻辑省略, 需要用到pageNum变量
*/
T t = null;//替换成从数据库中读
return t;
}
/**
* 从数据库中返回总页数
* 具体方法省略
* 需要用到pageNum变量
* @return
*/
public int getTotalDataFromMysql() {
return 0;
}
}
Controller方法
public class Controller {
Paginator paginator = new Paginator();
public <T>T getData(){
Iterator<T> ite = paginator.iterator();
return ite.first();
}
public <T>T next() {
Iterator<T> ite = paginator.iterator();
return ite.next();
}
}
完毕
结语
以上的代码并没有什么实际意义, 只是为了便于理解迭代器模式的意义设计的, 只是提供了一个大致的思路, 用迭代器模式实现了分页功能,里边有很多细节没有考虑。 如果想更详细地完善该功能的话可以自己再去仔细研究。 以上就是我学习迭代器模式的一些心得和体会