码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 第十九章·迭代器模式


    一、迭代器模式的概述

    定义:
    迭代器模式:提供一个方法顺序访问一个聚合对象中的各个元素,而又不用暴露该对象的内部表示。

    二、迭代器模式的结构和实现

    2.1 迭代器模式的结构

    迭代器模式包含以下4个角色:

    1. Iterator(抽象迭代器):定义了访问和遍历元素的接口,声明了用于遍历数据元素的方法;
    2. ConcreteIterator(具体迭代器):实现了抽象迭代器的方法,完成对聚合对象的遍历;
    3. Aggregate(抽象聚合类):用于存储和管理元素对象;
    4. ConcreteAggregate(具体聚合类):是抽象聚合类的子类,实现了在抽象聚合类中声明的方法。

    2.2 迭代器模式的实现

    //抽象迭代器

    /**
     * 抽象迭代器
     */
    public interface AbstractIterator {
    
        //移至下一个元素
        Object next();
    
        //移至上一个元素
        Object previous();
    
        //判断是否为最后一个元素
        boolean isLast();
    
        //判断是否为第一个元素
        boolean isFirst();
    
        //获取第一个元素
        Object getFistItem();
    
        //获取最后一个元素
        Object getLastItem();
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    //具体迭代器

    /**
     * 遥控器,充当具体迭代器
     */
    public class RemoteControl implements AbstractIterator {
    
        private List channels;//电视机的频道
    
        private int cursor;//游标,记录当前遍历的位置
    
        public RemoteControl(Television television) {
            this.channels = television.getObjects();
            cursor = 0;
        }
    
        @Override
        public Object next() {
            if (cursor >= channels.size() - 1) {
                cursor = -1;
            }
            cursor++;
            return channels.get(cursor);
        }
    
        @Override
        public Object previous() {
            if (cursor <= 0) {
                cursor = channels.size();
            }
            cursor--;
            return channels.get(cursor);
        }
    
        @Override
        public boolean isLast() {
            return cursor == channels.size();
        }
    
    
        @Override
        public boolean isFirst() {
            return cursor == 0;
        }
    
        @Override
        public Object getFistItem() {
            cursor = 0;
            return channels.get(cursor);
        }
    
        @Override
        public Object getLastItem() {
            cursor = channels.size() - 1;
            return channels.get(cursor);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    //抽象聚合类

    
    /**
     * 抽象聚合类
     */
    public abstract class AbstractObjectList {
    
        private List objects = new ArrayList<>();
    
        public AbstractObjectList(List objects){
            this.objects = objects;
        }
    
        public void add(Object o){
            this.objects.add(o);
        }
    
        public void remove(Object o){
            this.objects.remove(o);
        }
    
        public List getObjects(){
            return objects;
        }
    
        public abstract AbstractIterator createIterator();
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    //具体聚合类

    /**
     * 电视机,充当具体聚合类
     */
    public class Television extends AbstractObjectList{
    
        public Television(List objects) {
            super(objects);
        }
    
        @Override
        public AbstractIterator createIterator() {
            return new RemoteControl(this);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    //客户端

    public class Client {
    
        public static void main(String[] args) {
    
            /**
             * 案例需求描述:
             * 电视机遥控器是一个迭代器的现实应用,通过它可以实现对电视机频道集合的遍历操作,
             * 电视机可以看成一个存储频道的聚合对象。
             * 使用迭代器模式模拟电视机遥控器的实现。
             */
    
    
            //电视机频道
            List channels = new ArrayList<>();
            channels.add("CCTV-1");
            channels.add("CCTV-2");
            channels.add("上海卫视");
            channels.add("东方卫视");
            channels.add("湖南卫视");
            channels.add("浙江卫视");
    
            //电视机
            Television tv = new Television(channels);
    
            //遥控器
            AbstractIterator iterator = tv.createIterator();
    
            //获取第一个频道
            System.out.println(iterator.getFistItem());
    
            //获取最后一个频道
            System.out.println(iterator.getLastItem());
    
            //下一个频道
            System.out.println(iterator.next());
            System.out.println(iterator.next());
            System.out.println(iterator.next());
    
            //上一个频道
            System.out.println(iterator.previous());
            System.out.println(iterator.previous());
            System.out.println(iterator.previous());
    
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    三、迭代器模式的优缺点和适用环境

    3.1 迭代器模式的优点

    1. 支持以不同的方式遍历一个聚合对象,在同一个聚合对上可以定义多种遍历方式;
    2. 简化了聚合类;
    3. 增加新的聚合类和迭代器类都很方便,无需修改原有代码,满足开闭原则;

    3.2 迭代器模式的缺点

    1. 由于迭代器模式将存储数据和遍历数据的职责分离,造成类的个数成对增加,在一定程度上增加了系统的复杂性;
    2. 抽象迭代器的设计难度较大,需要充分考虑到系统将来的扩展。

    3.3 迭代器模式的适用环境

    1. 访问一个聚合对象的内容而无需暴露它的内部表示。
    2. 需要为一个聚合对象提供多种遍历方式
    3. 为遍历不同的聚合结构提供一个统一的接口,在该接口的实现类中为不同的集合结构提供不同的遍历方式,而客户端可以一致性地操作该接口。

    【参考文献】:
    本文是根据刘伟的《Java设计模式》一书的学习笔记,仅供学习用途,勿做其他用途,请尊重知识产权。

    【本文代码仓库】:https://gitee.com/xiongbomy/java-design-pattern.git

  • 相关阅读:
    企业c#语言源代码防泄密解决方案
    产品设计小技能
    电动化浪潮的助力中国汽车产业崛起
    基于stm32单片机输入捕获简易频率测量数字频率计Proteus仿真
    关于图灵测试和中文屋Chinese room的理解
    千巡翼X1断点续飞功能
    基于5G网络的智能车间MES设计方案
    【牛客刷题--SQL篇】多表查询链接查询 SQL22统计每个学校的答过题的用户的平均答题数
    HTML <ul> 标签
    pytest实战练习
  • 原文地址:https://blog.csdn.net/weixin_44143114/article/details/126533095
    • 最新文章
    • 攻防演习之三天拿下官网站群
      数据安全治理学习——前期安全规划和安全管理体系建设
      企业安全 | 企业内一次钓鱼演练准备过程
      内网渗透测试 | Kerberos协议及其部分攻击手法
      0day的产生 | 不懂代码的"代码审计"
      安装scrcpy-client模块av模块异常,环境问题解决方案
      leetcode hot100【LeetCode 279. 完全平方数】java实现
      OpenWrt下安装Mosquitto
      AnatoMask论文汇总
      【AI日记】24.11.01 LangChain、openai api和github copilot
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
    正则表达式工具 cron表达式工具 密码生成工具

    京公网安备 11010502049817号