JAVA 设计模式-迭代器模式学习和一些体会

前言

最近在学习设计模式, 为了便于理解和记忆,故将学习过程中的一些心得和体会记录在此,一方面可以帮助记忆,另一方面便于分享自己的知识。 今天我学习的是迭代器模式,迭代器模式内容网上一大堆资料, 但是为什么要使用迭代器模式网上大部分是说可以方便遍历容器内容,隐藏一些实现细节啥的, 我们平时遍历写个for循环就OK了,也没必要写个迭代器, 为了便于理解迭代器的作用,我想了一个简单的分页功能(只是简单写了一些思路,没有具体实现)。 分页很类似于遍历,于是就有了此文。

迭代器

简单来说,迭代器的类图大概是这样子的

  1. 两个接口
    一个是迭代接口定义迭代的基本方法, 另外一个是功能接口,用于创建迭代器。 分别为 Aggregate (iterator方法)Iterator(next(), hasNext()等)
  2. 两个实现类
    分别实现上面两个方法 create出具体的Iterator
  3. 遍历内容
    也就是具体的实体类
    遍历的时候可以将数据存放到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();
	}
}

完毕

结语

以上的代码并没有什么实际意义, 只是为了便于理解迭代器模式的意义设计的, 只是提供了一个大致的思路, 用迭代器模式实现了分页功能,里边有很多细节没有考虑。 如果想更详细地完善该功能的话可以自己再去仔细研究。 以上就是我学习迭代器模式的一些心得和体会

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值