博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
迭代器模式
阅读量:2434 次
发布时间:2019-05-10

本文共 3230 字,大约阅读时间需要 10 分钟。

迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示.

 1.当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历时,就应该考虑用迭代器模式。
 2.当需要对聚集对象有多种遍历方式时,可以考虑用迭代器模式。
 3.迭代器模式在访问数组,集合,列表等数据时,尤其是数据库数据操作时,是非常普遍的应用,

    所以各种高级语言 都对它进行了封装,反而给人感觉此模式本身不太常用。

 

 

/** * 聚集抽象类 */public abstract class Aggregate {		// 创建迭代器	public abstract Iterator createIteraotr();}

 

/** * 具体的聚集类,继承聚集抽象类Aggregate */public class ConcreteAggregate extends Aggregate{	// 声明一个List泛型变量,用于存放聚合对象	private List items = new ArrayList();	@Override	public Iterator createIteraotr() {				return new ConcreteIterator(this);	}	// 返回集合总个数	public int count(){		return items.size();	}	public List getItems() {		return items;	}	public void setItems(List items) {		this.items = items;	}}

 

/** * 迭代器抽象类 */public abstract class Iterator {		// 开始对象	public abstract Object first();	// 下一个对象	public abstract Object next();	// 当前对象	public abstract Object currentItem();	// 是否到结尾	public abstract boolean isDone();}

 

/** * 具体的迭代器类,继承迭代器抽象类Iterator */public class ConcreteIterator extends Iterator{		// 定义一个具体的聚集对象	private ConcreteAggregate aggregate;	private int current =0 ;		// 初始化时将具体的聚集对象传入	public ConcreteIterator(ConcreteAggregate aggregate){		this.aggregate =aggregate;	}	@Override	public Object currentItem() {		// 返回当前的聚集对象		return aggregate.getItems().get(current);	}	@Override	public Object first() {		// 得到聚集的第一个对象		return aggregate.getItems().get(0);	}	@Override	public boolean isDone() {		// 判断当前是否遍历到结尾,到结尾返回true		return current>=aggregate.count()?true:false;	}	@Override	public Object next() {				// 得到聚集的下一个对象		Object ref = null;		current++;		if(current

 

/** * 反向遍历的具体的迭代器类,继承迭代器抽象类Iterator */public class ConcreteIteratorDesc extends Iterator{		// 定义一个具体的聚集对象	private ConcreteAggregate aggregate;	private int current =0 ;		// 初始化时将具体的聚集对象传入	public ConcreteIteratorDesc(ConcreteAggregate aggregate){		this.aggregate =aggregate;		current = aggregate.count()-1;	}	@Override	public Object currentItem() {		// 返回当前的聚集对象		return aggregate.getItems().get(current);	}	@Override	public Object first() {		// 得到聚集的第一个对象		return aggregate.getItems().get(aggregate.count()-1);	}	@Override	public boolean isDone() {		// 判断当前是否遍历到结尾,到结尾返回true		return current<0?true:false;	}	@Override	public Object next() {				// 得到聚集的下一个对象		Object ref = null;		current--;		if(current>=0){			ref = aggregate.getItems().get(current);		}		return ref;	}}

 

public class Main {		public static void main(String[] args) {				// 聚集对象(公交车)		ConcreteAggregate a = new ConcreteAggregate();				// 对象集合(新上来的乘客)		List items = new ArrayList();		items.add("大鸟");		items.add("小菜");		items.add("行李");		items.add("老外");		items.add("公交内部员工");		items.add("小偷");				a.setItems(items);				// 迭代器对象		Iterator i = new ConcreteIterator(a);				// 迭代器第一个对象(从第一个乘客开始)		Object item = i.first();		while(!i.isDone()){			System.out.println(i.currentItem()+"请买车票");			i.next();		}		System.out.println("------------反向遍历---------------");				//-----反向遍历-------------------		Iterator iDesc = new ConcreteIteratorDesc(a);		// 迭代器第一个对象(从最后一个乘客开始)		Object item2 = iDesc.first();		while(!iDesc.isDone()){			System.out.println(iDesc.currentItem()+"请买车票");			iDesc.next();		}	}}

 

输出结果如下:

 

大鸟请买车票小菜请买车票行李请买车票老外请买车票公交内部员工请买车票小偷请买车票------------反向遍历---------------小偷请买车票公交内部员工请买车票老外请买车票行李请买车票小菜请买车票大鸟请买车票

 

转载地址:http://pyxmb.baihongyu.com/

你可能感兴趣的文章
Docker是啥?容器变革的火花?
查看>>
假如从餐饮店的角度来看架构…
查看>>
这个充电宝太黑科技了,又小又不用自己带线,长见识了~
查看>>
HDC.2019后再发力,AppGallery Connect服务新升级
查看>>
网易云音乐热评的规律,44万条数据告诉你
查看>>
超神!GitHub 标星 5.5w,如何用 Python 实现所有算法?
查看>>
扛住100亿次请求——如何做一个“有把握”的春晚红包系统
查看>>
在北京看场雪为什么这么难?
查看>>
新年了,5G手机芯片,到底买谁?
查看>>
疫情之下「在家办公模式」开启,你该选择哪些远程协同工具?
查看>>
如何使用pdpipe与Pandas构建管道?
查看>>
远程办公的33种预测
查看>>
阿里巴巴架构师:十问业务中台和我的答案
查看>>
华为云发布三类六款计算实例 打造更强云端计算能力
查看>>
PHP 语言地位遭受挑战,PHP 程序员路在何方?
查看>>
PostgreSQL好评如潮,它是如何做到的?
查看>>
2017码云群英会,共享开源技术盛宴
查看>>
看完这份参会指南,Get 2017 OSC 年终盛典正确参会姿势!
查看>>
盛食厉兵 中科天玑挖掘大数据价值助力行业数字化转型
查看>>
白鹭引擎正式支持微信小游戏开发
查看>>