您现在的位置是:首页 > 编程 > 

设计模式(二十):行为型之迭代器模式

2025-07-21 05:58:00
设计模式(二十):行为型之迭代器模式 一、设计模式分类创建型模式 用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”提供了单例、原型、工厂方法、抽象工厂、建造者 5 种创建型模式结构型模式 用于描述如何将类或对象按某种布局组成更大的结构提供了代理、适配器、桥接、装饰、外观、享元、组合 7 种结构型模式行为型模式 用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任

设计模式(二十):行为型之迭代器模式

一、设计模式分类
  • 创建型模式
    • 用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”
    • 提供了单例、原型、工厂方法、抽象工厂、建造者 5 种创建型模式
  • 结构型模式
    • 用于描述如何将类或对象按某种布局组成更大的结构
    • 提供了代理、适配器、桥接、装饰、外观、享元、组合 7 种结构型模式
  • 行为型模式
    • 用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责
    • 提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器 11 种行为型模式
二、迭代器模式

1、概述

定义

提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示

2、结构

迭代器模式主要包含以下角:

  • 抽象聚合(Aggregate)角:定义存储、添加、删除聚合元素以及创建迭代器对象的接口
  • 具体聚合(ConcreteAggregate)角:实现抽象聚合类,返回一个具体迭代器的实例
  • 抽象迭代器(Iterator)角:定义访问和遍历聚合元素的接口,通常包含 hat()、next() 等方法
  • 具体迭代器(Concretelterator)角:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置

、实现

  • 定义一个可以存储学生对象的容器对象
  • 将遍历该容器的功能交由迭代器实现

类图如下:

代码如下:

  • 定义迭代器接口,声明hat、next方法
代码语言:javascript代码运行次数:0运行复制
public interface StudentIterator {

    //判断是否还有元素
    boolean hat();

    //获取下一个元素
    Student next();
}
  • 定义具体的迭代器类,重写所有的抽象方法
代码语言:javascript代码运行次数:0运行复制
public class StudentIteratorImpl implements StudentIterator {

    private final List<Student> list;
    private int position = 0;//用来记录遍历时的位置

    public StudentIteratorImpl(List<Student> list) {
        this.list = list;
    }

    @Override
    public boolean hat() {
        return position < list.size();
    }

    @Override
    public Student next() {
        //从集合中获取指定位置的元素
        Student currentStudent = list.get(position);
        position++;
        return currentStudent;
    }
}
  • 定义抽象容器类,包含添加元素,删除元素,获取迭代器对象的方法
代码语言:javascript代码运行次数:0运行复制
public interface StudentAggregate {

    //添加学生功能
    void addStudent(Student stu);

    //删除学生功能
    void removeStudent(Student stu);

    //获取迭代器对象功能
    StudentIterator getStudentIterator();
}
  • 定义具体的容器类,重写所有的方法
代码语言:javascript代码运行次数:0运行复制
public class StudentAggregateImpl implements StudentAggregate {

    // 学生列表
    private final List<Student> list = new ArrayList<>();

    @Override
    public void addStudent(Student stu) {
        list.add(stu);
    }

    @Override
    public void removeStudent(Student stu) {
        list.remove(stu);
    }

    //获取迭代器对象
    @Override
    public StudentIterator getStudentIterator() {
        return new StudentIteratorImpl(list);
    }
}
  • 测试类
代码语言:javascript代码运行次数:0运行复制
public class Client {
    public static void main(String[] args) {
        //创建聚合对象
        StudentAggregateImpl aggregate = new StudentAggregateImpl();
        //添加元素
        aggregate.addStudent(new Student("张三","001"));
        aggregate.addStudent(new Student("李四","002"));
        aggregate.addStudent(new Student("王五","00"));
        aggregate.addStudent(new Student("赵六","004"));

        //1,获取迭代器对象
        StudentIterator iterator = aggregate.getStudentIterator();
        //2,遍历
        while(iterator.hat()) {
            //,获取元素
            Student student = ();
            println(());
        }
    }
}

4、优缺点

优点

  • 它支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式
    • 在迭代器模式中只需要用一个不同的迭代器来替换原有迭代器即可改变遍历算法
    • 我们也可以自己定义迭代器的子类以支持新的遍历方式
  • 迭代器简化了聚合类。由于引入了迭代器,在原有的聚合对象中不需要再自行提供数据遍历等方法,这样可以简化聚合类的设计
  • 在迭代器模式中,由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足 “开闭原则” 的要求

缺点

  • 增加了类的个数,这在一定程度上增加了系统的复杂性

5、使用场景

  • 当需要为聚合对象提供多种遍历方式时
  • 当需要为遍历不同的聚合结构提供一个统一的接口时
  • 当访问一个聚合对象的内容而无须暴露其内部细节的表示时

6、JDK源码解析

迭代器模式在JAVA的很多集合类中被广泛应用

代码语言:javascript代码运行次数:0运行复制
List<String> list = new ArrayList<>();
//list.iterator()方法返回的肯定是Iterator接口的子实现类对象
Iterator<String> iterator = list.iterator(); 
while (iterator.hat()) {
    println(());
}

单列集合都使用到了迭代器,我们以ArrayList举例来说明

  • List:抽象聚合类
  • ArrayList:具体的聚合类
  • Iterator:抽象迭代器
  • list.iterator():返回的是实现了 Iterator 接口的具体迭代器对象

具体的来看看 ArrayList的代码实现

代码语言:javascript代码运行次数:0运行复制
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    
    public Iterator<E> iterator() {
        return new Itr();
    }
    
    private class Itr implements Iterator<E> {
        int cursor;       // 下一个要返回元素的索引
        int lastRet = -1; // 上一个返回元素的索引
        int expectedModCount = modCount;

        Itr() {}
		
        //判断是否还有元素
        public boolean hat() {
            return cursor != size;
        }

        //获取下一个元素
        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new oSuchElementException();
            Object[] elementData = ;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }
        ...
}
  • iterator() 方法中返回了一个实例化的Iterator对象
  • Itr是ArrayList一个内部类,它实现了 Iterator 接口并重写了其中的抽象方法

注意:

  • 当我们在使用JAVA开发的时候,想使用迭代器模式的话
  • 只要让我们自己定义的容器类实现java.util.Iterable并实现其中的iterator()方法使其返回一个 java.util.Iterator 的实现类就可以了
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:202-06-26,如有侵权请联系 cloudcommunity@tencent 删除设计模式容器遍历对象接口

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1161657.html

相关标签:无
上传时间: 2025-07-20 17:23:41
留言与评论(共有 18 条评论)
本站网友 抗衰老化妆品
23分钟前 发表
通常包含 hat()
本站网友 暗暗
13分钟前 发表
备忘录
本站网友 性检查
12分钟前 发表
RandomAccess
本站网友 星河皓月二手房
14分钟前 发表
"004")); //1
本站网友 第五大道吧
2分钟前 发表
满足 “开闭原则” 的要求 缺点 增加了类的个数
本站网友 清远房产
16分钟前 发表
状态
本站网友 小儿发烧怎么办
26分钟前 发表
设计模式(二十):行为型之迭代器模式 一
本站网友 许昌电影院
15分钟前 发表
命令
本站网友 哇靠
0秒前 发表
优缺点 优点 它支持以不同的方式遍历一个聚合对象
本站网友 美容去皱纹
7分钟前 发表
"002")); aggregate.addStudent(new Student("王五"
本站网友 进入recovery
12分钟前 发表
抽象工厂
本站网友 书报架模型
20分钟前 发表
满足 “开闭原则” 的要求 缺点 增加了类的个数
本站网友 射干的功效与作用
24分钟前 发表
无须修改原有代码
本站网友 皇冠的秘密
7分钟前 发表
删除元素
本站网友 杭州世纪联华超市
16分钟前 发表
删除元素
本站网友 如何预防糖尿病
0秒前 发表
原型
本站网友 少言寡语
6分钟前 发表
组合 7 种结构型模式行为型模式 用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务