介绍
- 提供一中可以遍历聚合对象的方式。又称为: 游标cursor模式
迭代器模式角色
- 抽象聚合类(Aggregate):提供了聚合相关的方法,并提供获取迭代器的方法;
- 具体集合类(ConcreteAggregate):实现了抽象聚合类;
- 抽象迭代器(Iterator):定义了迭代相关的方法;
- 具体迭代器(ConcreteIterator): 实现了抽象迭代器的方法。
场景:
- 需要以一种特定的方式遍历聚合对象;
- 聚合对象:存储数据
- 迭代器:遍历数据
开发中常见的场景
- JDK内置的迭代器(List/Set)
代码实现
- 抽象聚合类
java
/**
* 抽象聚合类
*/
public interface Aggregate {
/**
* 添加对象
* @param obj
*/
void addObject(Object obj);
/**
* 移除对象
* @param obj
*/
void removeObject(Object obj);
/**
* 获取迭代器方法
* @return
*/
MyIterator iterator();
}
- 抽象迭代器
java
/**
* 抽象迭代器
*/
public interface MyIterator {
/**
* 当前游标置零
*/
void first();
/**
* 将游标指向下一个元素
*/
void next();
/**
* 是否存在下一个元素
* @return
*/
boolean HasNext();
/**
* 判断当前对象是否第一个元素
* @return
*/
boolean isfirst();
/**
* 判断当前对象是否最后一个元素
* @return
*/
boolean isLast();
/**
* 获取当期游标对象
* @return
*/
Object getCurrentObj();
}
- 具体聚合类,内部类方法定义具体迭代器
java
public class ConcreteAggregate implements Aggregate {
private List<Object> list = new ArrayList<Object>();
/**
* 添加对象
* @param obj
*/
@Override
public void addObject(Object obj){
list.add(obj);
}
/**
* 移除对象
* @param obj
*/
@Override
public void removeObject(Object obj){
list.remove(obj);
}
/**
* 获取迭代器方法
* @return
*/
@Override
public MyIterator iterator() {
return new ConcreteIterator();
}
/**
* 使用内部类定义迭代器,可以直接使用外部类的属性
*/
private class ConcreteIterator implements MyIterator{
/**
* 定义游标---用于记录遍历List容器时的位置
*/
private int cursor;
/**
* 当前游标置零
*/
@Override
public void first() {
cursor=0;
}
/**
* 获取当期游标对象
*/
@Override
public Object getCurrentObj() {
return list.get(cursor);
}
/**
* 将游标指向下一个元素
*/
@Override
public void next() {
if(cursor<list.size()){
cursor++;
}
}
/**
* 是否存在下一个元素
*/
@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;
}
}
}
- 测试调用
java
public static void main(String[] args) {
Aggregate cma = new ConcreteMyAggregate();
cma.addObject("aaa");
cma.addObject("bbb");
cma.addObject("ccc");
MyIterator iterator=cma.iterator();
while(iterator.HasNext()){
System.out.println(iterator.getCurrentObj());
iterator.next();
}
System.out.println("----------------------------------");
cma.removeObject("bbb");
MyIterator iter=cma.iterator();
while(iter.HasNext()){
System.out.println(iter.getCurrentObj());
iter.next();
}
}
更多设计模式学习:
设计模式持续更新中...