• 迭代器模式


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

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

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

     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 }

    具体的迭代器类。

     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 }

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

     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 }
     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 }

    我们来看看客户端。

     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迭代器类的。

  • 相关阅读:
    php部分---include()与require()的区别、empty()与isset is_null的区别与用法详解
    DataSet 的详细用法(转)
    DataSet 的用法(转)
    大神的博客地址
    c#报表 柱,饼状图
    WebApi 增删改查(2)
    Linq to SQL 的左连,右连,内连(转)
    WebApi 增删改查
    Linq to SQL 的连表查询(转)
    LINQ
  • 原文地址:https://www.cnblogs.com/yulinfeng/p/5918478.html
Copyright © 2020-2023  润新知