Iterator

迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而不暴露该对象的内部表示。

当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你应该考虑迭代模式。为遍历不同的聚集结构提供如 开始、下一个、是否结束、目前哪一个 等统一接口。

迭代模式分离了对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部数据。

1 public abstract class Iterator {
2 //用于定义得到开始对象,得到下一个对象,是否到结尾,当前对象等方法,统一接口。
3 public abstract Object getFirst();
4 public abstract Object next();
5 public abstract boolean isDone() ;
6 public abstract Object getCurrentItem();
7 }
1 public abstract class Aggregate {
2 //创建迭代器
3 public abstract Iterator createIterator();
4 }
 1 public class ConcreteAggregate extends Aggregate{
2
3 //声明一个List变量,用于存放聚合对象。
4 private List<Object> items = new ArrayList<Object>();
5
6 @Override
7 public Iterator createIterator() {
8 return new ConcreteIterator(this);
9 }
10
11 //返回聚集总个数
12 public Object getItem(int index){
13 return items.get(index);
14 }
15
16 public void setItem(int index, Object obj){
17 items.add(index, obj);
18 }
19
20 public void setItem(Object obj){
21 items.add(obj);
22 }
23
24 public int getCount(){
25 return items.size() ;
26 }
27 }
 1 public class ConcreteIterator extends Iterator{
2
3 //定义一个具体聚集对象
4 private ConcreteAggregate aggregate ;
5 private int current = 0 ;
6
7 public ConcreteIterator(ConcreteAggregate aggregate){
8 this.aggregate = aggregate ;
9 }
10
11 @Override //得到当前对象
12 public Object getCurrentItem() {
13 return aggregate.getItem(current);
14 }
15
16 @Override //得到第一个对象
17 public Object getFirst() {
18 return aggregate.getItem(0);
19 }
20
21 @Override //是否已结尾
22 public boolean isDone() {
23 return current >= aggregate.getCount() ? true : false ;
24 }
25
26 @Override //得到下一对象
27 public Object next() {
28 Object obj = null ;
29 current ++ ;
30 if(current < aggregate.getCount()){
31 obj = aggregate.getItem(current);
32 }
33 return obj;
34 }
35
36 }
 1 public class ConcreteIteratorDec extends Iterator{
2
3 private ConcreteAggregate aggregate ;
4 private int current = 0 ;
5
6 public ConcreteIteratorDec(ConcreteAggregate aggregate){
7 this.aggregate = aggregate ;
8 current = aggregate.getCount() -1 ;
9 }
10
11 @Override
12 public Object getCurrentItem() {
13 return aggregate.getItem(current);
14 }
15
16 @Override
17 public Object getFirst() {
18 return aggregate.getItem(aggregate.getCount() -1);
19 }
20
21 @Override
22 public boolean isDone() {
23 return current < 0 ? true : false ;
24 }
25
26 @Override
27 public Object next() {
28 Object obj = null ;
29 current -- ;
30 if(current >= 0){
31 obj = aggregate.getItem(current);
32 }
33 return obj;
34 }
35
36 }
 1     public static void main(String[] args) {
2
3 ConcreteAggregate agg = new ConcreteAggregate();
4
5 agg.setItem("abc");
6 agg.setItem("小花");
7 agg.setItem("阿猫");
8 agg.setItem("阿狗");
9 agg.setItem("小草");
10 agg.setItem("菊花");
11 agg.setItem("efg");
12
13 //从头到尾遍历
14 //Iterator iterator = new ConcreteIterator(agg);
15 //从尾到头遍历
16 Iterator iterator = agg.createIterator();
17
18 Object obj1 = iterator.getFirst();
19
20 while(!iterator.isDone()){
21 System.out.println(iterator.getCurrentItem());
22 iterator.next();
23 }
24
25 }

 

posted @ 2012-03-16 15:44  Kyle_Java  阅读(1143)  评论(0编辑  收藏  举报