zoukankan      html  css  js  c++  java
  • 行为型设计模式

    基本介绍

    迭代器模式(Iterator Pattern)是 Java 中使用最多的一种模式,它可以顺序的访问容器中的元素,但不需要知道容器的内部细节

    模式结构

    Iterator(抽象迭代器):定义遍历元素所需的基本方法

    ConcreteIterator(具体迭代器):根据自己的需求实现抽象方法,完成迭代

    Aggregate(抽象容器):定义对容器的基本操作

    ConcreteAggregate(具体容器):抽象容器的具体实现类,iterator方法返回一个具体的迭代器

    举例说明

    使用迭代器模式实现对数据的遍历

    抽象迭代器

    public interface Iterator<T> {
        boolean hasNext();
        T next();
    }
    

    具体迭代器

    public class ConcreteIterator<T> implements Iterator<T> {
        private List<T> list; //遍历的集合
        private int index = -1; //遍历的索引
    
        public ConcreteIterator(List<T> list) {
            this.list = list;
        }
    
        @Override
        public boolean hasNext() {
            return index < list.size() - 1;
        }
    
        @Override
        public T next() {
            T t = null;
            if (this.hasNext()) {
                t = list.get(++index);
            }
            return t;
        }
    }
    

    抽象容器

    public interface Aggregate<T> {
        void add(T t);
    
        void remove(T t);
    
        Iterator<T> iterator();
    }
    

    具体容器

    public class ConcreteAggregate<T> implements Aggregate<T> {
        private List<T> list = new ArrayList<>();
    
        @Override
        public void add(T obj) {
            list.add(obj);
        }
    
        @Override
        public void remove(T obj) {
            list.remove(obj);
        }
    
        @Override
        public Iterator<T> iterator() {
            return new ConcreteIterator<>(list);
        }
    }
    

    测试类

    public class Client {
        @Test
        public void test() {
            Aggregate<String> aggregate = new ConcreteAggregate<>();
            aggregate.add("张三");
            aggregate.add("李四");
            aggregate.add("王五");
            Iterator<String> iterator = aggregate.iterator();
            while (iterator.hasNext()){
                System.out.println(iterator.next());
            }
        }
    }
    

    运行结果

    张三
    李四
    王五
    

    模式分析

    优点:

    • 提供一种统一的遍历方式,用户不需要再考虑聚合的类型,使用一种方式就可以遍历
    • 隐藏了聚合对象内部的细节,客户端遍历的时候取到的是迭代器对象,不会知道聚合的具体组成
    • 符合单一职责原则,把管理对象集合和遍历对象集合的责任分开,这样一来,集合改变只会影响到聚合对象,遍历方式改变只会影响到迭代器对象

    缺点:

    • 每个聚合对象都需要一个迭代器,类的个数成对增加,增加了系统的复杂性

    适用场景:

    • 当要展示一组相似对象,遍历一组相同对象时使用

    在 ArrayList 中的应用

    Java 中的容器对象有很多,基本都涉及到迭代器,我们以 ArrayList 作为例子,剖析它是如何应用迭代器模式的。

    打开 ArrayList 源码可以发现:

    • ArrayList 实现了 List 接口,使用 Object 数组存储元素
    • 在 List 接口中定义了 iterator() 以及很多对操作集合的方法
    • 在 ArrayList 中对 iterator() 进行了重写,并返回一个 Itr 对象
    • Itr 是 ArrayList 的内部类,并且实现了 Iterator 接口

    综上,其基本关系就是:

    当然,List 下的实现类不止 ArrayList,Iterator 下也有许多具体迭代器,它们各自有各自的实现方式,共同构建了 Java 中强大的容器类。

    (完)

  • 相关阅读:
    IDEA-各模块间引用出现问题的解决方法
    【MyBatis学习06】_parameter:解决There is no getter for property named in class java.lang.String
    《转载》JVM垃圾回收机制
    java面试复习题四
    Java中excel转换为jpg/png图片 采用aspose-cells-18.6.jar
    POI导出复杂的excel;excel公共样式类;excel拼接定制类;数据科学计数法转为普通值
    java发送邮件无法显示图片 图裂 的解决办法
    pom.xml文件最详细的讲解
    Tomcat启动报Error listenerStart错误 Context [] startup failed due to previous errors
    ora-01031:insufficient privileges解决方法
  • 原文地址:https://www.cnblogs.com/songjilong/p/12807345.html
Copyright © 2011-2022 走看看