提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
/** * 聚集抽象类 * created by callmedevil on 2019/8/17. */ public abstract class aggregate { // 创建迭代器 public abstract iterator createiterator(); }
/** * 迭代器抽象类 * created by callmedevil on 2019/8/17. */ public abstract class iterator { // 用于定义得到开始对象、得到下一对象、判断是否到结尾、当前对象等抽象方法 public abstract object first(); public abstract object next(); public abstract boolean isdone(); public abstract object currentitem(); }
/** * 具体聚集类 * created by callmedevil on 2019/8/17. */ public class concreteaggregate extends aggregate { // 存放聚合对象 private list<object> items = new arraylist(); @override public iterator createiterator() { return new concreteiterator(this); } // 返回聚集的总个数 public int count() { return items.size(); } // 声明一个索引器 public object get(int index) { return items.get(index); } public boolean set(object o) { return items.add(o); } }
/** * 具体迭代器类 * created by callmedevil on 2019/8/17. */ public class concreteiterator extends iterator { // 定义一个具体聚集对象 private concreteaggregate aggregate; private int current = 0; public concreteiterator(concreteaggregate aggregate){ // 初始化时将具体的聚集对象传入 this.aggregate = aggregate; } @override public object first() { // 得到聚集的第一个对象 return aggregate.get(0); } @override public object next() { object ret = null; current++; if (current < aggregate.count()) { // 得到聚集的下一个对象 ret = aggregate.get(current); } return ret; } @override public boolean isdone() { // 判断当前是否遍历到结尾 return current >= aggregate.count(); } @override public object currentitem() { // 返回当前的聚集对象 return aggregate.get(current); } }
public class test { public static void main(string[] args) { // 公交车聚集对象 concreteaggregate a = new concreteaggregate(); // 新上来的乘客 a.set("路飞"); a.set("鸣人"); a.set("一护"); a.set("悟空"); a.set("纳兹"); a.set("琦玉"); // 售票员登场,看好上车的是哪些人,即声明迭代器对象 iterator i = new concreteiterator(a); system.out.println(string.format("车位no.1乘客:%s", i.first())); while (!i.isdone()){ system.out.println(string.format("%s 来不及解释了,快上车!", i.currentitem())); i.next(); } } }
车位no.1乘客:路飞 路飞 来不及解释了,快上车! 鸣人 来不及解释了,快上车! 一护 来不及解释了,快上车! 悟空 来不及解释了,快上车! 纳兹 来不及解释了,快上车! 琦玉 来不及解释了,快上车!
/** * 倒序具体迭代器 * created by callmedevil on 2019/8/17. */ public class concreteiteratordesc extends iterator{ // 定义一个具体聚集对象 private concreteaggregate aggregate; private int current = 0; public concreteiteratordesc(concreteaggregate aggregate){ // 初始化时将具体的聚集对象传入 this.aggregate = aggregate; current = aggregate.count() - 1; //不同1 } @override public object first() { // 得到聚集的第一个对象 return aggregate.get(aggregate.count() - 1); //不同2 } @override public object next() { object ret = null; current--; //不同3 if (current >= 0) { //不同4 // 得到聚集的下一个对象 ret = aggregate.get(current); } return ret; } @override public boolean isdone() { // 判断当前是否遍历到结尾 return current < 0; //不同5 } @override public object currentitem() { // 返回当前的聚集对象 return aggregate.get(current); } }
将顺序测试类中声明迭代器具体对象改为倒序的 concreteiteratordesc 即可。
车位no.1乘客:琦玉 琦玉 来不及解释了,快上车! 纳兹 来不及解释了,快上车! 悟空 来不及解释了,快上车! 一护 来不及解释了,快上车! 鸣人 来不及解释了,快上车! 路飞 来不及解释了,快上车!
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明的访问集合内部的数据。
如对本文有疑问, 点击进行留言回复!!
【面试题】研究过tomcat的NioEndpoint源码吗?请阐述下Reactor多线程模型在tomcat中的实现。
荐 厉害了!阿里P8架构师用4大技术文档带你深入解读爆火的中台战略
网友评论