迭代器模式
场景:
提供一种可以遍历聚合对象的方式。又称为游标cursor模式
聚合对象:存储数据
迭代器模式:遍历数据
聚集抽象类 Aggregate
Iterator
迭代抽象类,用于定义得到开始对象,得到下一个对象,判断是否到结尾,当前对象等抽象方法,统一接口
具体聚集类:继承Aggregate
具体迭代器类,继承Iterator,实现开始,下一个,是否结尾,当前对象等方法。
使用场景:
前向迭代器
后向迭代器
List/Set内置的迭代器
/**
* 自定义抽象迭代器接口
*/
package com.bjsxt.cn.iterator;
public interface MyIterator {
public void first();//将游标指向下一个元素
public void last();//将有表指向最后一个元素
public void next();
public boolean hasNext();//判断是否有下一个元素
public boolean isFirst();
public boolean isLast();
public Object CurrentObj();//获取当前对象
}
package com.bjsxt.cn.iterator;
import java.util.ArrayList;
import java.util.List;
/**
* 自定义聚合类
* @author wannachan@outlook.com
*
*/
public class ConcreteMyAggregate {
private List<Object> list = new ArrayList<Object>();
public void addObject(Object obj) {
list.add(obj);
}
public Object removeObj(Object obj) {
return list.remove(obj);
}
//获得迭代器
public MyIterator createIterator() {
return new ConcreteIterator();
}
//使用内部类定义迭代器,可以直接使用外部类的属性
private class ConcreteIterator implements MyIterator {
private int cursor;//定义游标用于记录遍历时的位置
@Override
public void first() {
cursor = 0;
}
@Override
public void last() {
cursor = list.size() - 1;
}
@Override
public boolean hasNext() {
if (cursor < list.size()) {
return true;
}
return false;
}
@Override
public boolean isFirst() {
return (cursor == 0)?true:false;
}
@Override
public boolean isLast() {
return (cursor == list.size()-1)?true:false;
}
@Override
public Object CurrentObj() {
if (cursor < list.size() ) {
return list.get(cursor);
}
return null;
}
@Override
public void next() {
if (cursor < list.size()) {
cursor++;
}
}
}
}
/**
* 测试类
* 2015年4月11日21:15:43
*/
package com.bjsxt.cn.iterator;
public class Client {
public static void main(String[] args) {
ConcreteMyAggregate cma = new ConcreteMyAggregate();
cma.addObject("AA");
cma.addObject("BB");
cma.addObject(new Student("周杰伦", 10000));
cma.addObject(1);
MyIterator iterator = cma.createIterator();
while (iterator.hasNext()) {
System.out.println(iterator.CurrentObj());
iterator.next();
}
}
}
class Student {
private String name;
private int id;
public Student(String name, int id) {
super();
this.name = name;
this.id = id;
}
public Student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return name + " "+ "id 为 " + id;
}
}
/*
* AA
BB
周杰伦 id 为 10000
1
*
*
*/