迭代器设计模式
提供一个方法按顺序遍历一个集合内的元素,而又不需要暴露该对象的内部表示。
应用场景
1、访问一个聚合的对象,而不需要暴露对象的内部表示
2、支持对聚合对象的多种遍历
3、对遍历不同的对象,提供统一的接口。
迭代器模式的角色构成
(1)迭代器角色(Iterator):定义遍历元素所需要的方法,一般来说会有这么三个方法:
- 取得下一个元素的方法next(),
- 判断是否遍历结束的方法hasNext()),
- 移出当前对象的方法remove(),
(2)具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成集合的迭代。
(3)容器角色(Aggregate): 一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等
(4)具体容器角色(ConcreteAggregate):就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkedList,Set接口的哈希列表的实现HashSet等。
这个模式用的比较少 看看理解一下就行
下面是一个Test实现类 (写的比较简单 很多东西没实现)
package iterator;
/**
* 迭代器模式
* @author vince
* @description
*/
public class Test {
public static void main(String[] args) {
MyList list = new ConcreteAggregate();//自己写的 里面用数组实现的
//相当于 List 和 ArrayList
list.add("刘备");
list.add("张飞");
list.add("关羽");
list.add("曹操");
list.add("诸葛亮");
Iterator iter = list.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
}
}
iterator接口
package iterator;
/**
* 迭代器的接口
* @author vince
* @description
*/
public interface Iterator {
public boolean hasNext();
public Object next();
//remove方法没写
}
MyList接口 容器接口 模仿List来的
package iterator;
/**
* 容器的接口
* @author vince
* @description
*/
public interface MyList {
void add(Object e);
Object get(int index);
Iterator iterator();
int getSize();
}
Iterator实现类 ConcreteIterator
package iterator;
/**
* 迭代器接口的具体实现类
* @author vince
* @description
*/
public class ConcreteIterator implements Iterator{
private MyList list = null;
private int index;//迭代器的指针
public ConcreteIterator(MyList list) {//通过构造器方法传进来
this.list = list;
}
@Override
public boolean hasNext() {
if(index>=list.getSize())
return false;
else return true;
}
@Override
public Object next() {
Object obj = list.get(index);
index++;
return obj;
}
}
MyList接口实现类 ConcreteAggregate
package iterator;
/**
* 容器接口的具体实现类 自己写的测试类 不是那么严谨
* @author vince
* @description
*/
public class ConcreteAggregate implements MyList{
private Object[] elements;//对象数组
private int size;
private int index;
public ConcreteAggregate() {
elements = new Object[100];//固定数组大小 没有写动态扩充
}
@Override
public void add(Object e) {
elements[index++] = e;
size++;
}
@Override
public Object get(int index) {//这个地方也没写判断下标是否越界
return elements[index];
}
@Override
public Iterator iterator() {
return new ConcreteIterator(this);
}
@Override
public int getSize() {
return size;
}
}