Java设计模式(二) 之 迭代器模式

源码均以JDK1.8作为参考

1.定义:

Iterator提供一种方法访问一个容器对象中各个元素,而又不需要暴露对象的内部细节。

2.解析:

通用类图:

类图解析:

2.1.Iterator抽象迭代器

抽象迭代器负责定义通用的接口约定,基本都是基于JDK中Iterator接口的定义,源码如下:

public interface Iterator<E> {
    boolean hasNext();

    E next();

    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
    /*
     * @since 1.8
     */
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

基本的Iterator都会有hasNext()、next()两个方法定义的约束,remove()方法提供了在遍历时删除容器内部元素,在JDK1.8中加入了default方法forEachRemaining(Consumer action),使得在遍历时,可以指定一个action进行遍历。

2.2.Concrete Iterator具体迭代器

Concrete Iterator实现了Iterator接口,并实现了其内部的方法定义,完成具体的迭代,此时的Iterator可以用两种方式实现。

一种是ConcreteIterator持有具体容器集合的引用,迭代时遍历集合的元素,常规的Iterator都是按照此种方式实现的。

一种是ConcreteIterator作为容器集合的内部类使用,由于内部类的特殊性,可以随时获得外部类的具体实现,完成迭代操作,但是此种实现的Iterator具有依赖性,不可重复使用。

2.3.Aggregate抽象容器

Aggregate抽象容器在Iterator模式中是一个可有可无的存在,定义了容器的一些上层操作,目的是针对多个容器之间关联性的处理。

2.4.Concrete Aggregate具体容器

具体容器的实现,需要定义其内部结构等,例如ArrayList依赖数组完成元素的存取、HashMap依赖数组、链表完成元素的存取等。

3.具体应用:

上面介绍的是Iterator设计模式的通用方式,接下来根据其通用定义完成一个简单的示例,通过Iterator模式进行遍历。

3.1.Iterator抽象迭代器

此迭代器约定使用java.util.Iterator的定义。

3.2.Concrete Iterator具体迭代器

public class ConcreteIterator implements Iterator {
    private Vector vector = new Vector();
    // .. 定义当前游标
    public int cursor = 0;
    @SuppressWarnings("unchecked")
    public ConcreteIterator(Vector _vector){
        this.vector = _vector;
    }
    // .. 判断是否到达尾部
    public boolean hasNext() {
        if(this.cursor == this.vector.size()){
            return false;
        }else{
            return true;
        }
    }
    // .. 返回下一个元素
    public Object next() {
        Object result = null;
        if(this.hasNext()){
            result = this.vector.get(this.cursor++);
        }else{
            result = null;
        }
        return result;
    }
    // .. 删除当前元素
    public boolean remove() {
        this.vector.remove(this.cursor);
        return true;
    }
}       

3.3.Aggregate抽象容器

public interface Aggregate {
    // .. 是容器必然有元素的增加
    public void add(Object object);
    // .. 减少元素
    public void remove(Object object);
    // .. 由迭代器来遍历所有的元素
    public Iterator iterator();
}

3.4.Concrete Aggregate具体容器

public class ConcreteAggregate implements Aggregate {
    // .. 容纳对象的容器
    private Vector vector = new Vector();
    // .. 增加一个元素
    public void add(Object object) {
        this.vector.add(object);
    }
    // .. 返回迭代器对象
    public Iterator iterator() {
        return new ConcreteIterator(this.vector);
    }
    // .. 删除一个元素
    public void remove(Object object) {
        this.remove(object);
    }
}

示例中ConcreteAggregate具体容器内部使用Vector作为结构实现,可以使用如下代码:

public class Test{
    public static void main(String[] args){
        ConcreteAggregate ca = new ConcreteAggregate();
        Iterator it = ca.iterator();
        while(it.hashNext()){
            it.next();
        }
    }
}

4.forEachRemaining应用:

forEachRemaining是在JDK1.8中加入的接口的default方法,体现了JDK1.8中函数式编程思想

4.1.首先实现Consumer接口

class Action implements Consumer{
    @Override
    public void accept(Object o) {
        // .. 自己需要处理的事情
    }
}

4.2.使用Iterator实例进行迭代

ConcreteAggregate ca = new ConcreteAggregate();
Iterator it = ca.iterator();
it.forEachRemaining(new Action());

注:以上是JDK1.8提供的函数式的处理方式,在低版本的JDK中是无法完成此类操作的。

5.注意:

1.尽管Iterator模式是一个很普遍的模式,但是一般的容器都已经提供了其具体实现,除非自己进行定义和实现容器,否则Iterator是没有必要的,另外需要注意的是在很多JDK容器的实现中,

对于实现了Iterator接口的容器类,有一些实现只是附加功能,像基于简单数组实现的容器类ArrayList、Vector等,其迭代器速度要比for循环的速度慢,而对于一些基于链表实现的容器类

LinkedList等,其迭代器的速度要比for循环的速度要快,所以在应用时,需要分情况进行具体考虑。

2.对于JDK1.7中新加入的for( : )快速迭代,正式基于Iterator的,只有实现了Iterator接口,并具有相应迭代器的集合容器,才可以使用其进行处理。

3.使用Iterator设计模式的最大理由是因为利用Iterator可以跟实现分开,单独进行递增。

4.过度依赖具体类反会提高类与类的耦合度,增加零部件复用的困难。为了降低耦合度,让类作为零件再利用,必须引进抽象类和接口的概念。

注:本人是参照《设计模式之禅》和《设计模式》两本书学习所得,其中加入了自己对于Iterator设计模式的理解,以及对于JDK中源码的理解。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-17 15:38:38

Java设计模式(二) 之 迭代器模式的相关文章

Java设计模式学习记录-迭代器模式

前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/O的各种实现用到了什么设计模式,我愣是想半天没想出来了,人家还给提示了我也没想出来,最后还是面试官给出的答案,是装饰模式,听到答案后就恍然大悟了,前两天刚看了装饰模式,还写下了I/O操作中的各种类都是用到了装饰模式,后来想想两方面原因造成的当时没回答出来,一是面试时紧张就容易想不起来,二是对设计模式

Java设计模式系列之迭代器模式

迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 迭代器模式的角色构成 (1)迭代器角色(Iterator):定义遍历元素所需要的方法,一般来说会有这么三个方法:取得下一个元素的方法next(),判断是否遍历结束的方法hasNext()),移出当前对象的方法remove(), (2)具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成集合的迭代. (3)容器角色(Aggregate): 

Java设计模式8:迭代器模式

迭代器模式 迭代器模式又叫做游标(Cursor)模式,其作用是提供一种方法访问一个容器元素中的各个对象,而又不暴露该对象的内部细节. 迭代器模式结构 迭代器模式由以下角色组成: 1.迭代器角色 负责定义访问和遍历元素的接口 2.具体迭代器角色 实现迭代器接口,并要记录遍历中的当前位置 3.容器角色 负责提供创建具体迭代器角色的接口 4.具体容器角色 实现创建具体迭代器角色的接口,这个具体迭代器角色与该容器的结构相关 迭代器模式在JDK中的应用及解读 迭代器模式就不自己写例子了,直接使用JDK中的

Java设计模式之工厂方法模式(转) 实现是抽象工厂?

Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织   2009-02-25   来源:IT168网站 文本Tag: 设计模式 Java [IT168 技术文章]          一 .工厂方法(Factory Method)模式 工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色

设计模式入门之迭代器模式Iterator

迭代器模式定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部实现 迭代器模式的结构和说明 Iterator::迭代器接口.定义访问和遍历元素的接口 ConcreteIterator:具体的迭代器实现对象.实现对聚合对象的遍历,并跟踪遍历时的当前位置 Aggregate:聚合对象.定义创建相应迭代器对象的接口 ConcreteAggregate:具体聚合对象.实现创建相应的迭代器对象 实例:一个公司,工资列表是用List实现的,后收购一家公司,工资列表是用Array实现

设计模式C++实现——迭代器模式

模式定义 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 迭代器模式让我们能游走于聚合内的每一个元素,而又不暴露其内部的表示.把游走的任务放在迭代器上,而不是聚合上.这样简化了聚合的接口和实现,也让责任各得其所. 模式结构: Iterator:迭代器定义访问和遍历元素的接口 ConcreteIterator:具体迭代器实现迭代器接口:对该聚合遍历时跟踪当前位置 Aggregate:聚合定义创建相应的迭代器对象接口 ConcreteAggregate:具体聚合实现

一起学java设计模式--适配器模式(结构型模式)

适配器模式 现有一个接口DataOperation定义了排序方法sort(int[]) 和查找方法search(int[], int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch 的binarySearch(int[], int)方法实现了二分查找算法.现使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中.绘制类图并编程实现. (要求实现

Java设计模式之接口型模式总结

摘要: 原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6508967.html 之前认真学习了Java设计模式中的四大接口型模式,分别为:适配器模式(Adapter).外观模式(Facade).合成模式(Composite).桥接模式(Bridge). 1.在此处再温习一下四种设计模式: (1)适配器模式: 我们能够访问的类中不存在我们要访问的内容时,就可以使用这个适配器模式,当然就类而言,其实不存在什么不能被访问,这里的不能访问都是人

java设计模式4--建造者模式(Builder)

本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址. 建造者模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 概述 当系统准备为用户提供一个内部结构复杂的对象时,就可以使用生成器模式,使用该模式可以逐步地构造对象,使得对象的创建更具弹性.生成器模式的关键是将一个包含有多个组件对象的创建分成若干个步骤,并将这些步骤封装在一个称作生成器的接口中. 适用性 1.当创建复杂