1.引入
java提供了很多容器,而迭代器模式就是提供一种方法,顺序访问聚集的对象。而又不暴露该集合的内部表示。里面也就一个需要被迭代的对象(集合),还有一个就是迭代器对象,用于对聚集对象进行迭代访问。如果之前学过Iterator的方式遍历集合将很好理解的。
2.举例
生活中,我们都做过公交,一般都是先排好队,然后依次刷公交卡上车,上车的时候都喊乘客往里走,这个就是从前到后遍历乘客对象,如果下车时也是从前门下的话,那么最后上车的需要第一个下车,就是从后往前遍历这写乘客了。而公交车就可以看作是一个集合,公交车能装多少人,也体现了集合的大小。而公交车司机师傅相当于迭代器,如果买票了上车,给集合添加对象,没买票就让乘客下车关门,删除对象。
3.实现
--3.1.抽象公交类(抽象集合):
public interface Bus {
//遍历集合元素
public Iterator iterate();
//取得集合元素
public Object get(int i);
//取得集合大小
public int size();
}
--3.2具体公交类(具体集合实现类):
public class ConcreteBus implements Bus{
private String[] str;
public ConcreteBus(String[] str){
this.str=str;
}
@Override
public Iterator iterate() {
// TODO Auto-generated method stub
return new ConcreteIterator(this);
}
@Override
public Object get(int i) {
// TODO Auto-generated method stub
return str[i];
}
@Override
public int size() {
// TODO Auto-generated method stub
return str.length;
}
}
--3.3.抽象迭代器类:
public interface Iterator {
//向前遍历
public Object previous();
//向后遍历
public Object next();
//是否满足向后遍历条件
public boolean hasNext();
//是否满足向前遍历条件
public boolean hasPrevious();
//取第一个元素
public Object first();
//取最后一个元素
public Object last();
}
--3.4.具体迭代器类:
public class ConcreteIterator implements Iterator{
private Bus bus;
private int position=-1;
private int lastPosition=0;
public ConcreteIterator(Bus bus){
this.bus=bus;
lastPosition=bus.size();
}
@Override
public Object previous() {
// TODO Auto-generated method stub
if(lastPosition>0){
lastPosition--;
}
return bus.get(lastPosition);
}
@Override
public Object next() {
// TODO Auto-generated method stub
if(position<bus.size()-1){
position++;
}
return bus.get(position);
}
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
if(position<bus.size()-1){
return true;
}else{
return false;
}
}
@Override
public boolean hasPrevious() {
// TODO Auto-generated method stub
if(lastPosition>0){
return true;
}else{
return false;
}
}
@Override
public Object first() {
// TODO Auto-generated method stub
return bus.get(0);
}
@Override
public Object last() {
// TODO Auto-generated method stub
return bus.get(bus.size());
}
}
--3.5.测试类:
public class Test {
public static void main(String[] args) {
String[] str={"A","H","F","W","E","M"};
Bus bus=new ConcreteBus(str);
Iterator it=bus.iterate();
while(it.hasPrevious()){
System.out.print(it.previous()+" ");
}
System.out.println();
while(it.hasNext()){
System.out.print(it.next()+" ");
}
}
}
结果:
M E W F H A
A H F W E M
-----------------------------------------------------------------------------------------------------------------
总结:
迭代器模式就是当需要对聚集的对象进行遍历时,可以使用。实际就是把遍历集合对象的行为与集合类进行分离了,遍历集合对象的类叫做迭代器。这样就可以不暴露集合类内部的结构,也可以让外部透明地访问集合类中的对象。