码迷,mamicode.com
首页 > 编程语言 > 详细

设计模式之第6章-迭代器模式(Java实现)

时间:2015-01-19 23:27:26      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:

设计模式之第6章-迭代器模式(Java实现)

  “我已经过时了,就不要讲了吧,现在java自带有迭代器,还有什么好讲的呢?”“虽然已经有了,但是具体细节呢?知道实现机理岂不美哉?”“好吧好吧。”(迭代器闷闷不乐的答应下来。作者吃着小笼包,咂咂嘴道:哼,想偷懒,窗户都没有~)。

迭代器模式之自我介绍

  正如你们所见,我目前已经没落了,基本上没人会单独写一个迭代器,除非是产品性质的研发,我的定义如下:Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.意思呢,就是:提供一种方法,访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。

  迭代器是为容器服务的,那么什么又是容器呢?所谓容器就是能容纳对象的所有的类型的统称。例如Collection集合类型、Set类型等等,这些在《Thinking in Java》里面的第Chapter 11里面有所介绍,想要深入了解容器的话还需要看Chapter 17,如果没有记错的话应该是这个,好了,继续,我呢,就是为了解决遍历这些容器而诞生的,当然,这些都是JDK1.0.8时代的事情了,现在jdk中早已有了迭代器的实现,所以呐,我也就是个过时的产物~下面上类图先:

 技术分享

  我提供了便利容器的方便性,容器只要管理增减就可以了,需要遍历时交给我。下面具体分析类图:

  • Iterator抽象迭代器:抽象迭代器负责定义访问和遍历元素的接口,而且基本上有固定的三个方法:first()获取第一个元素,next()获取下一个元素,isDone()是否访问完了。Java中是hasNext()。
  • ConcreteIterator具体迭代器:实现迭代器接口,完成容器元素遍历。
  • Aggregate抽象容器:负责提供创建具体的迭代器角色接口。
  • ConcreteAggregate具体容器:具体容器实现容器接口定义的方法,创建出容纳迭代器的对象。

迭代器模式之自我分析

  缺点么,还真没有,优点如下:

  • 支持以不同的方法遍历一个聚合。
  • 简化了聚合的接口。
  • 在同一个聚合上可以有多个遍历。

迭代器之实现

  既然如此的不是很常用,那就直接进行通用代码的实现吧,首先是抽象迭代器:

1 public interface Iterator{
2     //遍历下一个元素
3     public object next();
4     //是否已经到最后一个元素
5     public boolean hasNext();
6     //删除当前指向的元素
7     public boolean remove();
8 }

  接下来是具体的迭代器实现代码: 

技术分享
 1 public class ConcreteIterator implements Iterator{
 2     private Vector vector = new Vector();
 3     //定义当前游标
 4     public int cursor  = 0;
 5     @SuppressWarnings("unchecked")
 6     public ConcreteIterator(Vector vector){
 7         this.vector = vector;
 8     }
 9 
10     //判断是否是最后一个
11     public boolean hasNext(){
12         if(this.cursor == this.vector.size()){
13             return false;
14         }
15         else
16             return true;
17     }
18 
19     //返回下一个元素
20     public Object next(){
21         Object result = null;
22         if(this.hasNext()){
23             result = this.vector.get(this.cursor++);
24         }
25         else
26             result = null;
27 
28         return result;
29     }
30 
31     //删除当前元素
32     public boolean remove(){
33         this.vector.remove(this.cursor);
34         return true;
35     }
36 
37 
38 }
View Code

  然后是抽象容器类:

1 public interface Aggregate{
2     //是容器必有的元素增加
3     public void add(Object object);
4     //减少元素
5     public void remove(Object object);
6     //由迭代器遍历
7     public Iterator iterator():
8 }

  最后是具体容器的实现类: 

技术分享
 1 public class ConcreteAggregate implements Aggregate{
 2     //容器对象的容器
 3     private Vector vector = new Vector();
 4     //增加一个元素
 5     public void add(Object object){
 6         this.vector.add(object);
 7     }
 8     //减少一个元素
 9     public void remove(Object object){
10         this.remove(object);
11     }
12     //返回迭代对象
13     public void add(Object object){
14         return new ConcreteIterator(this.vector);
15     }
16 }
View Code

  以上就是具体的通用方法的实现了。

迭代器模式应用场合

  虽然我这种模式不再使用,但是迭代这种容器却是使用的很频繁的,经常编程的你们想必也见到过很多~下面就来介绍一下具体的使用场合,其实我可以用来:

  • 访问一个聚合对象的内容而无需暴露它的内部表示。
  • 支持对聚合对象的多种遍历。
  • 为遍历不同的聚合结构提供一个统一的接口(即:支持多态迭代)。

  以上。欲知后式为何物,且听下回分解。

 

  

   PS:本博客欢迎转发,但请注明博客地址及作者~

   博客地址:http://www.cnblogs.com/voidy/

   博客新址:http://voidy.gitcafe.com

   <。)#)))≦

 

设计模式之第6章-迭代器模式(Java实现)

标签:

原文地址:http://www.cnblogs.com/voidy/p/4232259.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!