zoukankan      html  css  js  c++  java
  • 设计模式之第6章-迭代器模式(Java实现)

    设计模式之第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.net

       <。)#)))≦

     

  • 相关阅读:
    UVA 10480 Sabotage (最大流最小割)
    bzoj2002 [Hnoi2010]Bounce 弹飞绵羊 (分块)
    poj3580 SuperMemo (Splay+区间内向一个方向移动)
    bzoj1500: [NOI2005]维修数列 (Splay+变态题)
    hdu3436 Queue-jumpers(Splay)
    hdu4710 Balls Rearrangement(数学公式+取模)
    hdu1890 Robotic Sort (splay+区间翻转单点更新)
    zoj2112 Dynamic Rankings (主席树 || 树套树)
    poj3581 Sequence (后缀数组)
    notepa++ Emmet的安装方法
  • 原文地址:https://www.cnblogs.com/voidy/p/4232259.html
Copyright © 2011-2022 走看看