迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象多的内部表示。
1、Iterator抽象类
public abstract class Iterator
{
public abstract Object First();
public abstract Object Next();
public abstract boolean IsDone();
public abstract Object CurrentItem();
}
2、Aggregate聚集抽象类
public abstract class Aggregate
{
public abstract Iterator createIterator();
}
3、ConcreteIterator具体迭代器类,继承Iterator
public class ConcreteIterator extends Iterator
{
private ConcreteAggregate aggregate;
private int current=0;
public ConcreteIterator(ConcreteAggregate aggregate)
{
// TODO Auto-generated constructor stub
this.aggregate=aggregate;
}
@Override
public Object First()
{
// TODO Auto-generated method stub
return aggregate.getItems().get(0);
}
@Override
public Object Next()
{
// TODO Auto-generated method stub
Object ret=null;
current++;
if(current<aggregate.getCount())
{
ret=aggregate.getItems().get(current);
}
return ret;
}
@Override
public boolean IsDone()
{
// TODO Auto-generated method stub
return current>=aggregate.getCount()?true:false;
}
@Override
public Object CurrentItem()
{
// TODO Auto-generated method stub
return aggregate.getItems().get(current);
}
}
4、具体迭代器类,倒序
public class ConcreteIteratorDesc extends Iterator
{
private ConcreteAggregate aggregate;
private int current;
public ConcreteIteratorDesc(ConcreteAggregate aggregate)
{
// TODO Auto-generated constructor stub
this.aggregate=aggregate;
current=aggregate.getCount()-2;
}
@Override
public Object First()
{
// TODO Auto-generated method stub
return aggregate.getItems(aggregate.getCount()-1);
}
@Override
public Object Next()
{
// TODO Auto-generated method stub
Object ret=null;
current--;
if(current>=0)
{
ret=aggregate.getItems(current);
}
return ret;
}
@Override
public boolean IsDone()
{
// TODO Auto-generated method stub
return current<0?true:false;
}
@Override
public Object CurrentItem()
{
// TODO Auto-generated method stub
return aggregate.getItems(current);
}
}
5、ConcreteAggregate具体聚集类,继承Aggregate
public class ConcreteAggregate extends Aggregate
{
private List<Object> items=new ArrayList<Object>();
public int count=0;
public List<Object> getItems()
{
return items;
}
public void setItems(int index,Object obj)
{
this.items.add(index,obj);
}
public Object getItems(int index)
{
return items.get(index);
}
public int getCount()
{
return items.size();
}
@Override
public Iterator createIterator()
{
// TODO Auto-generated method stub
return new ConcreteIterator(this);
}
}
6、客户端类
public class Client
{
public static void main(String[] args)
{
ConcreteAggregate a=new ConcreteAggregate();
a.setItems(0,"大鸟");
a.setItems(1,"小菜");
a.setItems(2,"行李");
a.setItems(3,"老外");
a.setItems(4,"员工");
a.setItems(5,"小偷");
//Iterator i=new ConcreteIterator(a);
Iterator i=new ConcreteIteratorDesc(a);
Object item=i.First();
while(!i.IsDone())
{
System.out.println(i.CurrentItem()+"请买票");
i.Next();
}
}
}