zoukankan      html  css  js  c++  java
  • 设计模式-迭代器模式(19)

    定义

    迭代器模式(Iterator Pattern)是使用率最高的几个模式之一,被广泛地应用到Java的API中。例如:Java的集合(Collection)框架中,就广泛使用迭代器来遍历集合中元素。

    英文原话:Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

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

    迭代器是为容器服务的,容器是指用来容纳其他对象的对象,例如:Collection集合类型、Set类型等。迭代器模式便于遍历和访问容器中的元素。

    角色:

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

    具体迭代器(Concrete Iterator)角色:该角色实现Iterator接口,完成容器元素的遍历。

    抽象聚集(Aggregate)角色:该角色提供创建迭代器角色的接口。

    具体聚集(Concrete Aggregate)角色:该角色实现抽象聚集接口,创建出容纳迭代器的对象。

    /**
     * 抽象迭代器
     */
    public interface Iterator {
        //下一个
        public Object next();
        //是否有下一个
        public boolean hasNext();
    }
    
    /**
     * 具体迭代器
     */
    public class ConcreteIterator implements Iterator{
        private ConcreteAggregate agg;     //集合类
        private int index = 0;    //下标
        private int size = 0;    //大小
    
        //将集合类传入迭代器
        public ConcreteIterator(ConcreteAggregate agg) {
            this.agg = agg;
            size = agg.size();
            index = 0;
        }
    
        /**
         * 返回下一个元素
         */
        @Override
        public Object next() {
            if (index<size) {
                return agg.getElement(index++);
            }
            return null;
        }
    
        /**
         * 是否有下一个元素,即是否遍历结束
         */
        @Override
        public boolean hasNext() {
            return index<size;
        }
    }
    
    /**
     * 聚集类接口
     */
    public interface Aggregate {
        public void add(Object obj);    //添加元素
        public Iterator creatIterator();    //创建迭代器
    }
    
    /**
     * 具体聚集类
     */
    public class ConcreteAggregate implements Aggregate {
        private Vector vector = new Vector();
    
        //添加元素
        @Override
        public void add(Object obj) {
            this.vector.add(obj);
        }
    
        //获取元素
        public Object getElement(int index){
            if (index < vector.size()){
                return vector.get(index);
            }else {
                return null;
            }
        }
    
        public int size(){
            return vector.size();
        }
    
        //创建迭代器
        @Override
        public Iterator creatIterator() {
            return new ConcreteIterator(this);
        }
    }
    public static void main(String[] args) {
    Aggregate agg = new ConcreteAggregate(); //相当于List list = new ArrayList();
    agg.add("元素1");
    agg.add("元素2");
    agg.add("元素3");
    //遍历
    Iterator iterator = agg.creatIterator();
    while (iterator.hasNext()){
    System.out.println(iterator.next());
    }
    }

    源码

    优点

    • 迭代器模式简化了访问容器元素的操作,具备统一的遍历接口。
    • 封装遍历算法,使算法独立于聚集角色。客户无需知道聚集对象的类型,即使聚集对象的类型发生变化,也不会影响遍历过程。

    缺点

    • 迭代器模式给使用者一种序列化的错觉,而产生错误。
    • 迭代器的元素都是Object类型,没有类型特征(JDK1.5之后引入泛型可以解决此问题)。

    应用场景

    迭代器模式现在被广泛的应用甚至已经成为一个最基础的工具。有些人建议将迭代器从23中模式删除,其原因就是迭代器模式太普通了,它已经融入到各种语言和各工具中。在Java语言中,从JDK1.2版本开始,就增加了java.util.Iterator接口,并将Iterator应用到各个聚集类(Collection)中,如ArrayList、Vector、Stack、HashSet等集合类都实现了iterator()方法,返回一个迭代器Iterator,便于对集合中的元素进行遍历。也正因为Java已经将迭代器模式融入最基本的API中,程序员在项目中无需再独立的写迭代器,直接使用即可。

     
  • 相关阅读:
    Unity中的欧拉旋转
    Unity-Rigidbody碰撞穿透
    C#实现单例模式的几种方法
    C#OO初级思想
    C#虚方法virtual
    数据库查询
    DNS 域名服务器搭建
    iptables 基本操作
    通过adb 操作手机
    linux 调整逻辑卷空间大小
  • 原文地址:https://www.cnblogs.com/aeolian/p/8909994.html
Copyright © 2011-2022 走看看