时间: 2020-09-19|53次围观|0 条评论

一、实质

提供一种可以遍历聚合对象的方式。又称游标模式

聚合对象:存储数据

迭代器:遍历数据

二、示例

正向遍历迭代器

设计模式学习笔记—迭代器模式iterator pattern(Java版)插图

package com.lgd.iterator;
/**
 * 自定义的迭代器接口
 * @author liguodong
 *
 */

public interface MyIterator {
	void first();//将游标指向第一个元素
	void next();//将游标指向下一个元素
	boolean hasNext();//判断是否存在下一个元素
	
	boolean isFirst();//是否是第一个元素
	boolean isLast();//是否是最后一个元素
	Object getCurrObj();//获取当前游标指向的对象
}

package com.lgd.iterator;


import java.util.ArrayList;
import java.util.List;

//聚集抽象类
public interface MyAggregate{
	public void addObject(Object obj);
	public void removeObject(Object obj);
	public List<Object> getList();
	public void setList(List<Object> list);
	public MyIterator createIterator();
}


/**
 * 自定义的聚合类
 * @author liguodong
 *
 */
class ConcreteMyAggregate implements MyAggregate{
	private List<Object> list = new ArrayList<>();


	public void addObject(Object obj)
	{
		this.list.add(obj);
	}
	
	public void removeObject(Object obj)
	{
		this.list.remove(obj);
	}
	public List<Object> getList() {
		return list;
	}
	public void setList(List<Object> list) {
		this.list = list;
	}
	//获得迭代器
	public MyIterator createIterator(){
		return new ConcreteIterator();
	}
	//使用内部类定义迭代器,可以直接使用外部类的属性
	private class ConcreteIterator implements MyIterator{
		
		private int cursor;//定义游标用于记录遍历的位置
		@Override
		public void first() {
			// TODO Auto-generated method stub
			cursor = 0;
		}

		@Override
		public void next() {
			// TODO Auto-generated method stub
			if(cursor<list.size())
			{
				cursor++;
			}
				
		}

		@Override
		public boolean hasNext() {
			// TODO Auto-generated method stub
			if(cursor<list.size())
			{
				return true;
			}
			return false;
		}

		@Override
		public boolean isFirst() {
			// TODO Auto-generated method stub
			return cursor==0?true:false;
		}

		@Override
		public boolean isLast() {
			// TODO Auto-generated method stub
			return cursor==list.size()-1?true:false;
		}

		@Override
		public Object getCurrObj() {
			// TODO Auto-generated method stub
			return list.get(cursor);
		}
		
	}
}

package com.lgd.iterator;

public class Client {
	public static void main(String[] args) {
		MyAggregate cma = new ConcreteMyAggregate();
		cma.addObject("aa");
		cma.addObject("bb");
		cma.addObject("cc");
		
		MyIterator iterator = cma.createIterator();
		while(iterator.hasNext())
		{
			System.out.println(iterator.getCurrObj());
			iterator.next();
		}
	}
}


运行结果:
aa
cc

逆向遍历迭代器(类似)


三、开发场景

JDK内置的迭代器(List/Set)




原文链接:https://blog.csdn.net/scgaliguodong123_/article/details/44066835

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《设计模式学习笔记—迭代器模式iterator pattern(Java版)
   

还没有人抢沙发呢~