package com.yukiyama.pattern.behavior;
import java.util.ArrayList;
import java.util.List;
/**
* 迭代器模式
*/
public class IteratorDemo {
public static void main(String[] args) {
// 声明一个聚合实例
AbstractAggregation agg = new MyAggregation();
// 通过add方法初始化这个聚合
agg.add("刘备");
agg.add("关羽");
agg.add("张飞");
// 声明一个迭代器实例
Iterator iter = agg.getIterator();
// 取出第一个元素
System.out.println("第一个元素: " + iter.first().toString());
// 调用迭代器的hasNext和next方法迭代遍历,用toString将元素转为String输出
System.out.println("====开始迭代遍历====");
while(iter.hasNext()) {
System.out.println(iter.next().toString());
}
}
}
/**
* 迭代器接口
* 定义迭代器角色的方法,获取聚合内第一个元素的方法first,获取下一个元素
* 的方法next,判断是否有下一个元素的方法hasNext。
*/
interface Iterator{
Object first();
Object next();
boolean hasNext();
}
/**
* 具体迭代器实现类
* 迭代器接口的实现类。持有聚合元素的集合List<Object>,并通过有参构造器
* 初始化该集合。持有当前处理元素的下标index,初始值为-1,表示初识时未
* 处理任何元素。实现fist,next和hasNext三个接口方法。
*/
class MyIterator implements Iterator{
private List<Object> list;
private int index = -1;
public MyIterator(List<Object> list) {
this.list = list;
}
@Override
public Object first() {
return list.get(0);
}
@Override
public Object next() {
Object obj = null;
// 判断有下一个元素时,获取下一个元素,当前元素下标index+1
if(this.hasNext()) {
obj = list.get(index + 1);
index++;
}
return obj;
}
@Override
public boolean hasNext() {
if(index < list.size() - 1) {
return true;
} else {
return false;
}
}
}
/**
* 抽象聚合类接口
* 定义三个聚合角色的方法,增加聚合元素的方法add,移除聚合元素的方法remove,
* 获取一个迭代器实例的方法getIterator。
*/
interface AbstractAggregation{
void add(Object obj);
void remove(Object obj);
public Iterator getIterator();
}
/**
* 具体聚合实现类
* 抽象聚合接口的实现类,以List<Object>持有一个聚合实例。实现抽象聚合接口
* 中的add,remove,getIterator方法。其中getIterator获取一个具体迭代器
* 类的实例,获取方式是通过有参构造器new一个具体迭代类的实例并返回,构造器
* 参数是聚合类内部持有的聚合对象List<Object> list。
*/
class MyAggregation implements AbstractAggregation{
private List<Object> list = new ArrayList<>();
@Override
public void add(Object obj) {
list.add(obj);
}
@Override
public void remove(Object obj) {
list.remove(obj);
}
@Override
public Iterator getIterator() {
return new MyIterator(list);
}
}