首页 > 其他分享 >设计模式--迭代器模式【行为型模式】

设计模式--迭代器模式【行为型模式】

时间:2025-01-10 16:57:29浏览次数:3  
标签:遍历 迭代 -- 模式 设计模式 public Staff

设计模式的分类

我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类:

  • 创建型模式(5 种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
  • 结构型模式(7 种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
  • 行为型模式(11 种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

在这里插入图片描述

设计模式系列文章传送门

设计模式的 7 大原则

设计模式–单例模式【创建型模式】

设计模式–工厂方法模式【创建型模式】

设计模式–抽象工厂模式【创建型模式】

设计模式–建造者模式【创建型模式】

设计模式–原型模式【创建型模式】

设计模式–适配器模式【结构型模式】

设计模式–装饰器模式【结构型模式】

设计模式–代理模式【结构型模式】

设计模式–外观模式(门面模式)【结构型模式】

设计模式–桥接模式【结构型模式】

设计模式–组合模式【结构型模式】

设计模式–享元模式【结构型模式】

设计模式–策略模式【行为型模式】

设计模式–模板方法模式【行为型模式】

设计模式–观察者模式【行为型模式】

什么是迭代器模式

迭代器模式是一种行为设计模式,它提供了统一方法来访问聚合对象(如数组、列表、树等复杂的数据结构)中的各个元素,而又不暴露该对象的内部表示,简单来说,就像是给数据结构配备了一个 “导游”,这个 “导游” 可以按照一定的规则(如顺序、逆序等)带领你访问数据结构中的每一个元素。

迭代器模式的组成

  • 抽象迭代器:定义了访问和遍历元素的方法,包括 hasNext()方法(用于判断是否还有下一个元素)和 next()方法(用于获取下一个元素)。
  • 具体迭代器:实现抽象迭代器接口,并重写其方法,完成具体的遍历逻辑,它要维护一个指向聚合对象当前元素的游标,并且根据迭代器接口定义的方法来实现元素的遍历。
  • 抽象聚合器:一般是一个接口,定义了创建迭代器的方法
  • 具体聚合器:实现抽象聚合器器接口,它包含了实际存储元素的数据结构,并且创建了具体的迭代器。

迭代器设计模式案例演示

我们以公司员工来做为演示场景,公司年会的时候需要当众表扬优秀员工,会在大屏幕上播放优秀员工信息,我们使用迭代器设计模式来实现,优秀员工名单就是一个集合,每个优秀员工就是集合中的元素。

Staff(员工类)

Staff 类定义了员工基本属性,代码如下:

public class Staff {

    //姓名
    private String name;

    //工号
    private String jobNumber;

    public Staff(String name, String jobNumber) {
        this.name = name;
        this.jobNumber = jobNumber;
    }

    @Override
    public String toString() {
        return "Staff{" +
                "name='" + name + '\'' +
                ", jobNumber='" + jobNumber + '\'' +
                '}';
    }
}

StaffIterator(抽象迭代器)

StaffIterator 继承了 Iterator 接口,Iterator 接口中提供了 hasNext()方法(用于判断是否还有下一个元素)和 next()方法(用于获取下一个元素)方法,代码如下:

public interface StaffIterator extends Iterator<Staff> {

}

StaffIteratorImpl(具体迭代器)

StaffIteratorImpl 持有一个用户集合,并重新了 hasNext()方法(用于判断是否还有下一个元素)和 next()方法,代码如下:

public class StaffAggregateImpl implements StaffAggregate {

    private List<Staff> staffList = new ArrayList<>();

    @Override
    public StaffIterator createIterator() {
        return new StaffIteratorImpl(staffList);
    }

    @Override
    public void add(Staff staff) {
        staffList.add(staff);
    }
}

StaffAggregate(抽象聚合器)

StaffAggregate 接口定义了一个创建迭代器的方法,并提供了一个添加元素的方法,代码如下:

public interface StaffAggregate {

    //创建迭代器
    StaffIterator createIterator();

    //添加员工
    void add(Staff staff);


}

StaffAggregateImpl(具体聚合器)

StaffAggregateImpl 实现了抽象聚合器接口,并重写了方法,代码如下:

public class StaffAggregateImpl implements StaffAggregate {

    private List<Staff> staffList = new ArrayList<>();

    @Override
    public StaffIterator createIterator() {
        return new StaffIteratorImpl(staffList);
    }

    @Override
    public void add(Staff staff) {
        staffList.add(staff);
    }
}

IteratorClient(客户端代码)

IteratorClient 客户端验证代码如下:

public class IteratorClient {

    public static void main(String[] args) {
        StaffAggregateImpl staffAggregate=new StaffAggregateImpl();
        staffAggregate.add(new Staff("小明","001"));
        staffAggregate.add(new Staff("小王","002"));
        StaffIterator iterator = staffAggregate.createIterator();
        while (iterator.hasNext()){
            Staff staff = iterator.next();
            System.out.println(staff);
        }
    }

}

执行结果如下:

Staff{name='小明', jobNumber='001'}
Staff{name='小王', jobNumber='002'}

可以看到我们使用迭代器模式完成了优秀员工的遍历。

迭代器设计模式的优缺点

优点:

  • 解耦数据结构和遍历算,法将集合对象和遍历逻辑分离,使得它们可以独立变化,集合对象只需要实现迭代器接口,而客户端只需要通过迭代器进行遍历操作,实现了解耦。
  • 统一遍历接口,客户端可以使用相同的方式来来处理不同的集合对象,例如可以使用迭代器模式为遍历不同的数据结构,如数组、链表、树等。

优点:

  • 增加系统复杂性,使用迭代器设计模式会增加类和接口,比如需要创建迭代器相关的类。
  • 在某些场景下会增加性能开销,比如一些简单的数组的访问使用索引访问比使用迭代器访问更高效。

迭代器设计模式的使用场景

  • 当要展示一组相似对象,或者遍历一组相同对象时候可以使用迭代器模式。

总结:本篇分享了迭代器设计模式的概念和使用方式,并用代码案例进行了简单演示,希望对不太熟悉迭代器模式的小伙伴们有一定的帮助。

如有不正确的地方欢迎各位指出纠正。

标签:遍历,迭代,--,模式,设计模式,public,Staff
From: https://blog.csdn.net/weixin_42118323/article/details/144435924

相关文章

  • 数据结构实验二
    石家庄铁道大学实验报告课程名称:信2305-3 任课教师:刘丹 实验日期:2024.12.11班级:信2305-3 姓名:徐戌 学号:20234316实验项目名称:实验二一、 实验目的1.掌握栈的定义及......
  • 数据结构实验一
    石家庄铁道大学实验报告课程名称:数据结构与算法设计 任课教师:刘丹 实验日期:2024.12.11班级:信2305-3 姓名:徐戌 学号:20234316实验项目名称:实验一一、 实验目的掌握顺序表的......
  • 数据结构实验2
    7-2双向循环链表应用已知p指向双向循环链表中的一个结点,其结点结构为data、prior、next三个域,实现交换p所指向的结点和它的前缀结点的顺序。输入格式:第一行输入元素个数,第二行输入元素值,第三行输入要交换的元素值,第四行输出结果。输出格式:输出交换后的结果,中间不用空格分......
  • 数据结构实验三
    石家庄铁道大学实验报告课程名称:信2305-3 任课教师:刘丹 实验日期:2024.12.15班级:信2305-3 姓名:徐戌 学号:20234316实验项目名称:实验三一、 实验目的1.掌握二叉树的定......
  • 数据结构实验五
    石家庄铁道大学实验报告课程名称:数据结构与算法设计 任课教师:刘丹 实验日期:2024.12.15班级:信2305-3 姓名:徐戌 学号:20234316实验项目名称:实验五一、 实验目的1.掌握散列表......
  • 数据结构实验3
    7-3修改数组(蓝桥杯)给定一个长度为N的数组A=[A1,A2,⋅⋅⋅AN],数组中有可能有重复出现的整数。现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A2,A3,⋅⋅⋅,AN。当修改Ai时,小明会检查Ai是否在A1∼Ai−1中出现过。如果出现过,则小明会给Ai加上......
  • 数据结构实验四
    石家庄铁道大学实验报告课程名称:信2305-3 任课教师:刘丹 实验日期:2024.12.15班级:信2305-3 姓名:徐戌 学号:20234316实验项目名称:实验四一、 实验目的1)掌握图的邻接矩......
  • 数据结构实验4
    7-2栈实现表达式求值使用键盘输入数学表达式(含数字,四种运算符+、-、、/和小括号,其中运算数都是一位数(0~9)),将数学表达式转化成后缀表达式输出,利用后缀表达式求表达式的值并输出。输入格式:输入正确的表达式(可以有空格)后回车,得到后缀表达式和结果。输入括号缺失的表达式,输出"ERR......
  • [ZJOI2007] 仓库建设
    前言这些题全部口胡,到李超线段树了再打代码好累啊,昨晚上不该太晚睡的,中午他们期末也没睡,精神萎靡思路先简化一下题意对于\(n\)个点,第\(i\)个点所在的位置为\(x_i\),其有\(p_i\)个物品,在\(i\)点建立仓库的费用为\(c_i\),求建造仓库的点集\(\mathb......
  • 数据结构实验六
    石家庄铁道大学实验报告课程名称:数据结构与算法设计 任课教师:刘丹 实验日期:2024.12.15班级:信2305-3 姓名:徐戌 学号:20234316实验项目名称:实验六一、 实验目的1.掌握插入排......