【java设计模式】(6)---迭代器模式(案例解析)

设计模式之迭代器模式

一、java迭代器介绍

1、迭代器接口

在jdk中,与迭代器相关的接口有两个:Iterator 与 Iterable。

Iterator:迭代器,Iterator及其子类通常是迭代器本身的结构与方法;迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。只要拿到

这个对象,使用迭代器就可以遍历这个对象的内部。

Iterable:可迭代的,那些想用到迭代器功能的其它类,如AbstractList HashMap等,需要实现该接口。

1)Iterator

Java提供一个专门的迭代器<<interface>>Iterator,我们可以对某个序列实现该interface,来提供标准的Java迭代器。Iterator接口实现后的功能是“使用”一个迭代器。

Package  java.util;
public interface Iterator<E> {
  //判断是否存在下一个对象元素
    boolean hasNext();
  //获得下一个元素
    E next();
   //移除下一个元素
    void remove();
} 

 2)Iterable

Java中还提供了一个Iterable接口,Iterable接口实现后的功能是“返回”一个迭代器(Iterator),我们常用的实现了该接口的子接口有: Collection<E>, Deque<E>, List<E>, Queue<E>, Set<E> 等.该接口的iterator()方

法返回一个标准的Iterator实现。

public interface Iterable<T> {
    Iterator<T> iterator();
} 

2、迭代器的实现

看完源码,我们来看看迭代器是如何使用的:

1) 若类A想要使用迭代器,则它的类声明部分为 class A implement Iterable

2) 在类A实现中,要实现Iterable接口中的唯一方法:Iterator<T> iterator(); 这个方法用于返回一个迭代器,即Iterator接口及其子类;

3) 在类A中,定义一个内部类S,专门用于实现Iterator接口,定制类A自已的迭代器实现。

如下:

    //A实现Iterable接口
class A implement Iterable
{
   //该接口返回一个Iterator对象
    Iterator<T> iterator() {...}
    class S implement Iterator<E>
    {
    //上面这个对象会有具体实现的方法
        boolean hasNext() {....}
        E next() {....}
        void remove() {....}
    }
}

下面我们来看下抽象类AbstractList的jdk源码

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> { // List接口实现了Collection<E>, Iterable<E>   

   protected AbstractList() {
   }    

   ...
  // 这里返回一个迭代器对象
   public Iterator<E> iterator() {
   return new Itr();
    }    

  //  Itr内部类实现迭代器
    private class Itr implements Iterator<E> { 

    int cursor = 0;
    int lastRet = -1;
    int expectedModCount = modCount;    

    // 实现hasNext方法
    public boolean hasNext() {
            return cursor != size();
    }
     // 实现next方法
    public E next() {
           //判断是否有下一个
            checkForComodification();
        try {
        E next = get(cursor);
        lastRet = cursor++;
      //返回下一个
        return next;
        } catch (IndexOutOfBoundsException e) {
        checkForComodification();
        throw new NoSuchElementException();
        }
    }
    // 实现remove方法
    public void remove() {
        if (lastRet == -1)
        throw new IllegalStateException();
            checkForComodification();    

        try {
        AbstractList.this.remove(lastRet);
        if (lastRet < cursor)
            cursor--;
        lastRet = -1;
        expectedModCount = modCount;
        } catch (IndexOutOfBoundsException e) {
        throw new ConcurrentModificationException();
        }
    }
    //判断是否有下一个方法
    final void checkForComodification() {
        if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
    }
    }
} 

3、小案例

//实现Iterable
class ScanAppleStore implements Iterable<String> {

  ArrayList<String> appleStore = new ArrayList<String>();
//为初始appleStore赋值
    ScanAppleStore() {
        Collections.addAll(appleStore, "Sweet", "Sour", "Bitter", "litter Sweet", "litter Sour", "litter Bitter");
        System.out.print(appleStore);
    }
  //重写Iterator方法
    @Override
    public Iterator<String> iterator() {
        return new Iterator<String>() {
            private int i = 0;

            public boolean hasNext() {
                if (i < appleStore.size()) {
                    return true;
                } else {
                    return false;
                }
            }

            public String next() {

                return appleStore.get(i++);
            }

            public void remove() {
                System.out.print("not defined!");
            }
        };
    }

    public Iterable<String> reverseIterator() {
        return new Iterable<String>() {
            public Iterator<String> iterator() {
                return new Iterator<String>() {
                    private int i = appleStore.size() - 1;

                    public boolean hasNext() {
                        if (i > -1) {
                            return true;
                        } else {
                            return false;
                        }
                    }

                    public String next() {

                        return appleStore.get(i--);
                    }

                    public void remove() {
                        System.out.print("not defined!");
                    }
                };
            }
        };  }}

测试类

public class TestIterable {
  //构造函数初始化
    TestIterable() {
        ScanAppleStore appleTree = new ScanAppleStore();
//采用系统自带的迭代器
        System.out.println("采用系统自带的迭代器iterator:");
        for (String str : appleTree) {
            System.out.println(str);

        }
        System.out.println("======================");
        System.out.println("采用自己重新迭代器,让相反输出");
//采用自己重新迭代器,让相反输出
        for (String str : appleTree.reverseIterator()) {
            System.out.println(str);
        }
    }

    public  static void main(String[] args) {
        TestIterable a = new TestIterable();

    }
}

运行结果

[Sweet, Sour, Bitter, litter Sweet, litter Sour, litter Bitter]采用系统自带迭代器iterator:
Sweet
Sour
Bitter
litter Sweet
litter Sour
litter Bitter
======================
采用自己重新迭代器,让相反输出:
litter Bitter
litter Sour
litter Sweet
Bitter
Sour
Sweet

二、迭代器模式

1、什么是迭代器模式

GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。

Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。

2、迭代器模式角色组成

1) 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。

  2) 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。

3) 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。

    4) 具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该容器的结构相关。

3、案例解析

1)迭代器角色

public interface Iterator {
public Object next();
public boolean hasNext();
}

 2)具体迭代器角色

public class ConcreteIterator implements Iterator {

    private List list = new ArrayList();
    private int cursor = 0;

    public ConcreteIterator(List list) {
        this.list = list;
    }

    @Override
    public Object next() {
        Object obj = null;
        if (this.hasNext()) {
            obj = this.list.get(cursor++);
        }
        return obj;
    }

    @Override
    public boolean hasNext() {
        if (cursor == list.size()) {
            return false;
        }
        return true;
    }
}

3)容器角色

public interface Aggregate {
    public void add(Object obj);
    public void remove(Object obj);
    public Iterator iterator();
}

4) 具体容器角色

public class ConcreteAggregate implements Aggregate {

    private List list = new ArrayList();  

    @Override
    public void add(Object obj) {
        list.add(obj);
    }
    @Override
    public void remove(Object obj) {
        list.remove(obj);
    }
    @Override
    public Iterator iterator() {
         return new ConcreteIterator(list);
    }
}

测试类

public class Client {

    public static void main(String[] args) {
        Aggregate ag = new ConcreteAggregate();
        ag.add("小明");
        ag.add("小红");
        ag.add("小刚");
        Iterator it = ag.iterator();
        while (it.hasNext()) {
            String str = (String) it.next();
            System.out.println(str);
        }
      }}

运行结果

小明
小红
小刚

4、迭代器优点和缺点

优点

1)它支持以不同的方式遍历一个聚合对象。
    2)迭代器简化了聚合类。
    3)在同一个聚合上可以有多个遍历。 
    4)在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

缺点

由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

参考

其实这整篇文章几乎都来自该篇文章,用参考都不太好意思,哈哈。

JAVA迭代器与迭代模式

想太多,做太少,中间的落差就是烦恼。想没有烦恼,要么别想,要么多做。中校【7】

原文地址:https://www.cnblogs.com/qdhxhz/p/9251809.html

时间: 2024-11-10 12:30:24

【java设计模式】(6)---迭代器模式(案例解析)的相关文章

Java 设计模式 行为型模式 + 案例

行为型模式:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式 策略模式(Strategy) 策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户.需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,也可以设计一个抽象类(可有可无,属于辅助类),提供辅助函数 //统一的接口 public interface ICalculator { public i

折腾Java设计模式之迭代器模式

迭代器模式 Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. 提供一种不公示其底层细节(结构)的情况下能顺序访问聚合对象元素的方法. 其实在java体系中,jdk已经引入了迭代器接口以及对于的容器接口等.就拿迭代器中的角色,在java中找出其对应的类. 具体角色 (1)迭代器角色(Iterator):定义遍

JAVA设计模式之 迭代器模式【Iterator Pattern】

一.概述 提供一种方法来访问聚合对象(容器container),而不用暴露这个对象的内部细节. 二.适用场景 1>遍历访问聚合对象中的元素,而无须暴露它的内容表示,将聚合对象的访问和内部数据的存储分离.使得访问聚合对象时无须了解其内部的实现细节. 2>需要为一个聚合对象提供多种遍历实现. 三.UML类图 四.参与者 1>Iterator(抽象迭代器):它定义了访问和遍历元素的接口,声明了用于遍历数据元素的方法,例如:用于获取第一个元素的first()方法,用于访问下一个元素的next()

Java设计模式之迭代器模式

概论 什么是迭代器模式?迭代器模式是提供一种方法访问一个容器对象中的各个元素,而又不需要暴露该对象的细节. 迭代器模式示例 迭代器模式中分为4种角色. ①抽象迭代器 ②具体迭代器 ③抽象容器 ④具体容器 首先我们一个抽象迭代器,抽象迭代器中包含遍历到下一个元素.判断遍历是否已经到了尾部.删除当前指向的元素. 1 public interface Iterator { 2 3 public Object next(); 4 public boolean hasNext(); 5 public bo

浅谈JAVA设计模式之——迭代器模式(interator)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45599951 一.概述 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 二.适用性 1.访问一个聚合对象的内容而无需暴露它的内部表示. 2.支持对聚合对象的多种遍历. 3.为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代). 三.参与者 1.Iterator 迭代器定义访问和遍历元素的接口. 2.ConcreteItera

java设计模式_迭代器模式

/**  * @Title: Aggregate.java  * @Package com.wangbiao.design  * @Description: TODO   * @author wangbiao     * @date 2014-9-20 下午05:02:00   * @version V1.0  */ package com.wangbiao.design.iterator; import java.io.ObjectInputStream.GetField; import ja

Java 设计模式 之 迭代器模式

http://www.verejava.com/?id=16999127808571 package com.iterator.theory; import java.util.Arrays; public class TestIterator { public static void main(String[] args) { List list=new ArrayList(); list.add("李阳"); list.add("王涛"); list.add(&

java设计模式--行为型模式--迭代模式

1 迭代器模式 2 概述 3 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 4 5 6 适用性 7 1.访问一个聚合对象的内容而无需暴露它的内部表示. 8 9 2.支持对聚合对象的多种遍历. 10 11 3.为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代). 12 13 14 参与者 15 1.Iterator 16 迭代器定义访问和遍历元素的接口. 17 18 2.ConcreteIterator 19 具体迭代器实现迭代器接口.

设计模式之迭代器模式(Iterator)

1.定义 迭代器模式提供一种方法访问一个容器对象中的各个元素,而又不需暴露该对象的内部细节. 基本上没有人会单独写一个迭代器,除非是产品性质的开发. 2.通用类图 Iterator抽象迭代器:抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first()获得第一个元素:next()访问下一个元素:isDone()是否已经访问到底部(Java 叫做hasNext()方法). ConcreteIterator具体迭代器:具体迭代器角色要实现迭代器接口,完成容器元素的遍历. Ag

2018.4.30 设计模式之迭代器模式

设计模式之迭代器模式 1.定义/概念 迭代器模式是Java和.Net编程环境中非常常用的设计模式.这种设计模式用于顺序访问集合对象的元素要知道集合对象的底层表示.迭代器模式属于行为型模式 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 2.角色和定义 ● Iterator抽象迭代器 抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first()获得第一个元素,next()访问下一个元素,isDone()是否已经访问