zoukankan      html  css  js  c++  java
  • Java设计模式之迭代器模式

    概论

    什么是迭代器模式?迭代器模式是提供一种方法访问一个容器对象中的各个元素,而又不需要暴露该对象的细节。

    迭代器模式示例

    迭代器模式中分为4种角色。

    ①抽象迭代器

    ②具体迭代器

    ③抽象容器

    ④具体容器

    首先我们一个抽象迭代器,抽象迭代器中包含遍历到下一个元素、判断遍历是否已经到了尾部、删除当前指向的元素。

    1 public interface Iterator {
    2 
    3     public Object next();
    4     public boolean hasNext();
    5     public boolean remove();
    6 }

    第3行,声明一个函数,获取下一个元素。

    第4行,声明一个函数,判断是否还有下一个元素。

    第5行,声明一个函数,删除元素。

    我们再来新增一个具体的迭代器:源代码如下所示:

     1 public class DefaultIterator implements Iterator {
     2 
     3     private Vector vector = new Vector();
     4     public int cursor = 0;
     5 
     6     public DefaultIterator(Vector vector) {
     7         this.vector = vector;
     8     }
     9 
    10     @Override
    11     public Object next() {
    12 
    13         if(this.hasNext()) {
    14             return this.vector.get(cursor++);
    15         }
    16         return null;
    17     }
    18 
    19     @Override
    20     public boolean hasNext() {
    21         if(this.cursor == this.vector.size()) {
    22             return false;
    23         }
    24         return true;
    25     }
    26 
    27     @Override
    28     public boolean remove() {
    29         this.vector.remove(this.cursor);
    30         return true;
    31     }
    32 }

    第3行:声明成员属性Vector

    第4行:声明成员属性Cursor

    第6行:带参数构造函数,用于初始化。

    我们自定义一个抽象的容器接口:包含新增元素,删除元素,获取迭代器。

    1 public interface Collection {
    2     public void add(Object object);
    3     public void remove(Object object);
    4     public Iterator iterator();
    5 }

    我们再定义一个具体的容器:

     1 public class DefaultIterator implements Iterator {
     2 
     3     private Vector vector = new Vector();
     4     public int cursor = 0;
     5 
     6     public DefaultIterator(Vector vector) {
     7         this.vector = vector;
     8     }
     9 
    10     @Override
    11     public Object next() {
    12 
    13         if(this.hasNext()) {
    14             return this.vector.get(cursor++);
    15         }
    16         return null;
    17     }
    18 
    19     @Override
    20     public boolean hasNext() {
    21         if(this.cursor == this.vector.size()) {
    22             return false;
    23         }
    24         return true;
    25     }
    26 
    27     @Override
    28     public boolean remove() {
    29         this.vector.remove(this.cursor);
    30         return true;
    31     }
    32 }

    最后我们增加一个场景类Client:代码如下图所示:

     1 public class Client {
     2 
     3     public static void main(String[] args) {
     4         Collection collection = new DefaultCollection();
     5         collection.add("111");
     6         collection.add("222");
     7         collection.add("333");
     8 
     9         Iterator iterator = collection.iterator();
    10         while (iterator.hasNext()) {
    11             System.out.println(iterator.next());
    12         }
    13     }
    14 }

    当然我们的容器存在是基于Vector,存储的形式有很多比如ArrayList,数组等等,当然不一定局限集合,比如缓存等。而迭代器模式在实际中往往不会自己去定义,而是直接采用Java提供的Iterator接口。

    迭代器模式在Java中的应用

     我们先看看一段很简单的代码:

     1 public class Client2 {
     2 
     3     public static void main(String[] args) {
     4         List<String> list = new ArrayList<String>();
     5         list.add("aaa");
     6         list.add("bbb");
     7 
     8         Iterator<String> iterator = list.iterator();
     9         while (iterator.hasNext()) {
    10             System.out.println(iterator.next());
    11         }
    12 
    13     }
    14 }

    在做什么,很简单,对list做迭代。我们先来看一下ArrayList的类结构图:

    从上图可以看出,ArrayList最顶层的接口是Iterable。然而,ArrayList中持有的真正的迭代器确实类自身的内部类Itr。这个类的父接口是Iterator<E>。而Iterable中所有的实现都是定义在这个内部类中。比如代码中的next、remove、hasNext等等。这几个方法中的原理,和我们上面例子非常的相似。

  • 相关阅读:
    在eclipse中进行HotSpot的源码调试
    CentOS6.5上编译OpenJDK7源码
    商城楼层跳转
    javascript原生百叶窗
    javascript原生轮播
    Canvas计时器
    纯js模拟 radio和checkbox控件
    纯js日历
    关于匿名函数,闭包和作用域链
    端口占用问题
  • 原文地址:https://www.cnblogs.com/candies123/p/10115828.html
Copyright © 2011-2022 走看看