• 19【迭代器设计模式】



    十九、迭代器设计模式

    19.1 迭代器设计模式简介

    19.1.1 迭代器设计模式概述

    迭代器设计模式(Iterator Pattern):它提供一种按顺序访问容器中对象的元素,而又无须暴露该容器的内部表示。迭代器模式可以为不同的容器提供一致的遍历行为,而不用关心容器内部元素的组成结构;

    迭代器模式的核心是把容器中的元素的迭代抽离到迭代器中,提供一致访问的接口;

    它适用于以下场景:

    • 1)访问一个容器对象的内容而无须暴露他的内部表示
    • 2)为遍历不同的容器结构提供一个统一的访问(迭代)接口

    19.1.2 迭代器设计模式的UML类图

    迭代器设计模式主要4个角色:

    • 1)抽象迭代器(Iterator):定义访问和遍历聚合元素的接口
    • 2)具体迭代器(ConcreteIterator):提供具体迭代的行为
    • 3)抽象容器(IAggregate):定义存储、添加、删除聚合元素以及创建迭代器对象的接口。
    • 4)具体容器(ConcreteAggregate):对抽象容器进行实现

    在这里插入图片描述

    19.2 迭代器设计模式的实现

    【案例】

    编写一个容器,提供增、删元素的方法;并提供迭代这些元素的方法;

    • 1)编写抽象迭代器:
    package com.pattern.demo01_手动实现观察者设计模式;
    
    /**
     * @author lscl
     * @version 1.0
     * @intro:
     */
    public interface Iterator<E> {
    
        E next();
    
        boolean hasNext();
    }
    
    • 2)编写具体迭代器:
    package com.pattern.demo01_手动实现观察者设计模式;
    
    import java.util.List;
    
    /**
     * @author lscl
     * @version 1.0
     * @intro:
     */
    public class IteratorImpl<E> implements Iterator<E> {
    
        // 需要迭代的容器
        private List<E> list;
        
        // 记录迭代的位置
        private int cursor = 0;
        
        // 当前迭代的元素
        private E element;
    
        public IteratorImpl(List<E> list) {
            this.list = list;
        }
    
        @Override
        public E next() {
    
            element = list.get(cursor);
            cursor++;
    
            return this.element;
        }
    
        @Override
        public boolean hasNext() {
    
            // 已经获取到list集合最大索引值
            if (cursor >= list.size()) {
                return false;
            }
    
            return true;
        }
    }
    
    • 3)定义抽象容器:
    package com.pattern.demo01_手动实现观察者设计模式;
    
    /**
     * @author lscl
     * @version 1.0
     * @intro:
     */
    public interface IAggregate<E> {
        void add(E e);
        void remove(E e);
    
        Iterator<E> iterator();
    }
    
    • 4)定义具体容器:
    package com.pattern.demo01_手动实现观察者设计模式;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @author lscl
     * @version 1.0
     * @intro:
     */
    public class AggregateImpl<E> implements IAggregate<E> {
    
        private List<E> list;
    
        public AggregateImpl() {
            this.list=new ArrayList<>();
        }
    
        @Override
        public void add(E e) {
            list.add(e);
        }
    
        @Override
        public void remove(E e) {
            list.remove(e);
        }
    
        @Override
        public Iterator<E> iterator() {
            return new IteratorImpl<>(list);
        }
    }
    

    19.3 迭代器设计模式的优缺点

    • 优点:
      • 1)解耦了迭代与集合,迭代器模式封装了具体的迭代算法,迭代算法的变更不会影响集合本身
      • 2)元素迭代功能多样化,每个集合对象都可以提供一个或多个迭代规则,使得同种元素可以不同的迭代行为
      • 3)简化集合对象,迭代器模式将集合本身应该提供的迭代功能抽离到迭代器中,使得集合无须关心迭代行为
    • 缺点:
      • 1)增加的类的数量,增加了系统的复杂性
      • 2)对于比较简单的遍历(数组),使用迭代器将会变得比较繁琐,另外,在日常开发中,我们基本上不会自己编写迭代器,开源框架提供的API完全够用,除非需要定制一个自己实现的数据结构对应的迭代器;
  • 相关阅读:
    适配与视口、分辨率、媒体查询、缩放的学习、消化
    详解 PyTorch 中的 torch.repeat 函数
    RK3399平台开发系列讲解(PCI/PCI-E)5.51、PCIE EP模式软件架构
    【无标题】
    讲讲 Redis 缓存更新一致性,看了都说好!
    Linux基本指令(一)
    OpenCV官方教程中文版 —— 图像修复
    【C++笔记】第十九篇 多态
    二叉搜索树相关题目总结(二) 力扣 Python
    Python中的函数、闭包、装饰器、lambda表达式、生成器和递归
  • 原文地址:https://blog.csdn.net/Bb15070047748/article/details/127095704