提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
/** * 聚集抽象类 * 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 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();}
* 迭代器抽象类
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); }}
* 具体聚集类
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 ConcreteIterator extends Iterator {
// 定义一个具体聚集对象
private ConcreteAggregate aggregate;
private int current = 0;
public ConcreteIterator(ConcreteAggregate aggregate){
// 初始化时将具体的聚集对象传入
this.aggregate = aggregate;
public Object first() {
// 得到聚集的第一个对象
return aggregate.get(0);
public Object next() {
Object ret = null;
current++;
if (current < aggregate.count()) {
// 得到聚集的下一个对象
ret = aggregate.get(current);
return ret;
public boolean isDone() {
// 判断当前是否遍历到结尾
return current >= aggregate.count();
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(); } }}
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乘客:路飞路飞 来不及解释了,快上车!鸣人 来不及解释了,快上车!一护 来不及解释了,快上车!悟空 来不及解释了,快上车!纳兹 来不及解释了,快上车!琦玉 来不及解释了,快上车!
车位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); }}
* 倒序具体迭代器
public class ConcreteIteratorDesc extends Iterator{
public ConcreteIteratorDesc(ConcreteAggregate aggregate){
current = aggregate.count() - 1; //不同1
return aggregate.get(aggregate.count() - 1); //不同2
current--; //不同3
if (current >= 0) { //不同4
return current < 0; //不同5
将顺序测试类中声明迭代器具体对象改为倒序的 ConcreteIteratorDesc 即可。
车位No.1乘客:琦玉琦玉 来不及解释了,快上车!纳兹 来不及解释了,快上车!悟空 来不及解释了,快上车!一护 来不及解释了,快上车!鸣人 来不及解释了,快上车!路飞 来不及解释了,快上车!
车位No.1乘客:琦玉
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明的访问集合内部的数据。
原文链接:http://www.cnblogs.com/call-me-devil/p/11368582.html
本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728