设计模式——迭代器模式

今天向大家介绍设计模式中比较常见的一种模式,迭代器模式。
最近在学习Python 这里就从两种语言 Java,Python 共同讲解迭代器模式在两种语言的体现。

友情提示:本人写这篇文章并不是东拼西凑出来,而是在查阅各种资料的前提下,然后基于自己的理解才动手写的。这里会带来一些问题,比如 讲解不到位有些地方博主理解有误、讲的不够全面不够细等等,再次希望大家谅解。我写文章的目的纯粹是为了分享生活中碰到的问题而后学习的过程与成果。

进入正题:

首先从概念上对 迭代器设计模式上进行讲解

迭代器模式

迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
迭代器模式属于行为型模式。

介绍
意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
主要解决:不同的方式来遍历整个整合对象。
何时使用:遍历一个聚合对象。
如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。
关键代码:定义接口:hasNext, next。
应用实例:JAVA 中的 iterator。
优点
1、它支持以不同的方式遍历一个聚合对象。
2、迭代器简化了聚合类。
3、在同一个聚合上可以有多个遍历。
4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点
由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
使用场景
1、访问一个聚合对象的内容而无须暴露它的内部表示。
2、需要为聚合对象提供多种遍历方式。
3、为遍历不同的聚合结构提供一个统一的接口。
注意事项
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。

讲完基本概念后,现在从Java和Python两中语言的实例来解析各场景下迭代器模式是如何体现的。

一、Java

首先创建一个实体类

/*
这是一个学生类
*/
@Data
public class Student implements Serializable {

    private String name;//姓名

    private String idCard;//身份证号

    private String studentNo;//学号
}

有个学生集合,现在有个需求,需要排除没有学号的学生(不适用Lambda

//创建初始数据
Student dto = new Student();
dto.setStudentNo("1");
dto.setName("小明");
Student dto1 = new Student();
dto1.setStudentNo("2");
dto1.setIdCard("sfz001");
dto1.setName("小张");
Student dto2 = new Student();
dto2.setIdCard("3");
dto2.setName("小兰");

List<Student> list = Lists.newArrayList();
list.add(dto);
list.add(dto1);
list.add(dto2);
list.add(dto2);

一般做法是:

        //错误做法
        for (Student s : list) {
            String studentNo = s.getStudentNo();
            if (studentNo.equals(null)){
                list.remove(s);
            }
        }

这里我来讲解下存在两个错误点:

1.空指针异常(java.lang.NullPointerException):
会导致空指针异常,因为在进行for遍历的过程中出现任何更改被遍历的集合,都会导致下次遍历出现找不到的情况。

2.并发修改异常(java.util.ConcurrentModificationException
如上一个异常解释相似,在遍历过程中集合任何 add,remove,modify等操作都可能导致出现concurrentmodificationException; query则可会导致nullpointerException

So,这里的做法是:

//正确做法
Iterator<Student> iterator = list.iterator();
while (iterator.hasNext()){
    Student next = iterator.next();
    String studentNo = next.getStudentNo();
    if (studentNo.equals(null)){
        iterator.remove();
    }
}

二、Python

未完待续……

作者的话:因为过年回到了老家,创作很慢,请谅解  ̄□ ̄||

“设计模式——迭代器模式”的2个回复

  1. 还作者的话:因为过年回到了老家,创作很慢,请谅解  ̄□ ̄||
    不会真有人会期待你更新把 🤭/偷笑

发表评论

电子邮件地址不会被公开。 必填项已用*标注