前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >迭代器模式

迭代器模式

作者头像
用户1148394
发布2018-01-09 16:58:41
6180
发布2018-01-09 16:58:41
举报
文章被收录于专栏:余林丰

今天要说的迭代器模式,实际上就是Java已经为我们实现好了,那就是Java的Iterator类。包括很多编程语言也有自己的迭代器类,但同时它也是一个设计模式,所以在我们实现迭代器模式的时候实际上就是在实现一个迭代器类。

我们先来了解何为迭代器?其实你把它简单理解为for循环也没什么问题,可以说是它是for循环的高级形式。它提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。我们为它提供开始、下一个、是否结束等方法。

定义一个迭代器接口,包含以下方法。

代码语言:javascript
复制
 1 package day_28_iterator;
 2 
 3 /**
 4  * 迭代器接口
 5  * @author turbo
 6  *
 7  * 2016年9月29日
 8  */
 9 public interface Iterator {
10     Object first();    //第一个元素
11     Object next();    //下一个元素
12     boolean isFinished();    //是否到结尾
13     Object currentItem();    //当前遍历的对象
14 }

具体的迭代器类。

代码语言:javascript
复制
 1 package day_28_iterator;
 2 
 3 import java.util.Vector;
 4 
 5 /**
 6  * 具体迭代器类
 7  * @author turbo
 8  *
 9  * 2016年9月29日
10  */
11 public class ConcreteIterator implements Iterator {
12     private int currentIndex = 0;
13     private Vector vector = null;
14     
15     public ConcreteIterator(Vector vector){
16         this.vector = vector;
17     }
18     
19     /* (non-Javadoc)
20      * @see day_28_iterator.Iterator#first()
21      */
22     @Override
23     public Object first() {
24         currentIndex = 0;
25         return vector.get(currentIndex);
26     }
27 
28     /* (non-Javadoc)
29      * @see day_28_iterator.Iterator#next()
30      */
31     @Override
32     public Object next() {
33         return vector.get(currentIndex++);
34     }
35 
36     /* (non-Javadoc)
37      * @see day_28_iterator.Iterator#isFinished()
38      */
39     @Override
40     public boolean isFinished() {
41         if (currentIndex > this.vector.size() - 1){
42             return true;
43         } else {
44             return false;
45         }
46     }
47 
48     /* (non-Javadoc)
49      * @see day_28_iterator.Iterator#currentItem()
50      */
51     @Override
52     public Object currentItem() {
53         return currentIndex;
54     }
55 
56 }

定义一个聚合类接口,用来模拟集合。

代码语言:javascript
复制
 1 package day_28_iterator;
 2 
 3 /**
 4  * 聚集(集合)接口,模拟集合接口,增删
 5  * @author turbo
 6  *
 7  * 2016年9月29日
 8  */
 9 public interface Aggregate {
10     Iterator createIterator();    //创建迭代器
11     void add(Object obj);    //新增元素
12     void remove(Object obj);    //删除元素
13 }
代码语言:javascript
复制
 1 package day_28_iterator;
 2 
 3 import java.util.Vector;
 4 
 5 /**
 6  * 具体聚集类
 7  * @author turbo
 8  *
 9  * 2016年9月29日
10  */
11 public class ConcreteAggregate implements Aggregate {
12     private Vector vector = null;
13     
14     public void setVector(Vector vector) {
15         this.vector = vector;
16     }
17     public Vector getVector() {
18         return vector;
19     }
20     
21     public ConcreteAggregate(){
22         vector = new Vector();
23     }
24     
25     /* (non-Javadoc)
26      * @see day_28_iterator.Aggregate#createIterator()
27      */
28     @Override
29     public Iterator createIterator() {
30         return new ConcreteIterator(vector);
31     }
32     /* (non-Javadoc)
33      * @see day_28_iterator.Aggregate#add(java.lang.Object)
34      */
35     @Override
36     public void add(Object obj) {
37         this.vector.add(obj);
38     }
39     /* (non-Javadoc)
40      * @see day_28_iterator.Aggregate#remove(java.lang.Object)
41      */
42     @Override
43     public void remove(Object obj) {
44         this.vector.remove(obj);
45     }
46     
47 }

我们来看看客户端。

代码语言:javascript
复制
 1 package day_28_iterator;
 2 
 3 /**
 4  * @author turbo
 5  *
 6  * 2016年9月29日
 7  */
 8 public class Main {
 9 
10     /**
11      * @param args
12      */
13     public static void main(String[] args) {
14         Aggregate agg = new ConcreteAggregate();
15         agg.add("a");
16         agg.add("b");
17         agg.add("c");
18         Iterator iterator = agg.createIterator();
19         while (!iterator.isFinished()){
20             System.out.println(iterator.next());
21         }
22         
23     }
24 
25 }

这样我们就简单的实现了一个迭代器,当需要对聚集(集合)有多种方式遍历时,可以考虑用迭代器模式,在下一篇中,我们会去JDK源代码看看Java是如何实现Iterator迭代器类的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-09-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档