一起来学设计模式之迭代器模式

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 前言目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~本节给大家讲一下设计模式中的迭代器模式,并结合实际业务场景给大家讲解如何使用~本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~迭代器模式迭代器模式是一种设计模式,它允许客户端逐个访问一个聚合对象中的元素,而不必了解该对象的内部结构。它将聚合对象和访问元素的方式分离开来,使得聚合对象的内部结构可以自由地改变,而不会影响客户端的访问方式。该模式提供了一种标准的方法来遍历一个聚合对象,而不需要了解该聚合对象的实现细节。

前言

目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~

本节给大家讲一下设计模式中的迭代器模式,并结合实际业务场景给大家讲解如何使用~

本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~

迭代器模式

迭代器模式是一种设计模式,它允许客户端逐个访问一个聚合对象中的元素,而不必了解该对象的内部结构。它将聚合对象和访问元素的方式分离开来,使得聚合对象的内部结构可以自由地改变,而不会影响客户端的访问方式。该模式提供了一种标准的方法来遍历一个聚合对象,而不需要了解该聚合对象的实现细节。

迭代器模式中,有两个主要的角色:聚合对象迭代器。聚合对象是一个包含一组元素的对象,它提供了一个创建迭代器的方法,该迭代器可以按照一定的顺序逐个访问该聚合对象中的元素。迭代器是一个对象,它提供了访问聚合对象中元素的方法,可以通过这些方法依次访问聚合对象中的元素。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorPatternDemo {
   public static void main(String[] args) {
      List<String> names = new ArrayList<String>();
      names.add("John");
      names.add("Mike");
      names.add("Sarah");
      Iterator<String> iter = names.iterator();
      while(iter.hasNext()) {
         String name = iter.next();
         System.out.println("Name: " + name);
      }
   }
}

在上面的示例中,我们创建了一个List对象,并向其中添加了一些字符串元素。然后,我们使用iterator()方法获取一个迭代器对象,并使用while循环遍历该列表,直到所有元素都被访问完毕。在循环中,我们使用hasNext()方法检查是否还有下一个元素,如果有,就使用next()方法获取下一个元素,并将其打印出来。

这个示例展示了如何使用Java集合框架提供的内置迭代器来遍历一个列表。在实际的应用中,我们也可以自己实现一个迭代器类来遍历一个自定义的聚合对象。无论是使用内置迭代器还是自定义迭代器,迭代器模式都可以帮助我们实现更加灵活、可扩展的遍历操作。

最佳实践

假设我们有一个电商平台的订单系统,其中有一个订单列表,我们可以使用迭代器模式来遍历这个订单列表。

假设我们有一个名为 Order 的类,它表示一个订单,包含订单号、订单时间、订单金额等属性:

public class Order {
    private String orderNumber;
    private String orderTime;
    private double orderAmount;
    public Order(String orderNumber, String orderTime, double orderAmount) {
        this.orderNumber = orderNumber;
        this.orderTime = orderTime;
        this.orderAmount = orderAmount;
    }
    public String getOrderNumber() {
        return orderNumber;
    }
    public String getOrderTime() {
        return orderTime;
    }
    public double getOrderAmount() {
        return orderAmount;
    }
}

接下来,我们定义一个名为 OrderList 的类,表示订单列表。在这个类中,我们使用一个名为 orders 的私有成员变量来存储订单列表,然后实现了 addOrder()、iterator()hasNext() 方法,其中 iterator() 方法返回了一个 OrderIterator 对象,它实现了迭代器接口。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class OrderList implements Iterable<Order> {
    private List<Order> orders;
    public OrderList() {
        this.orders = new ArrayList<>();
    }
    public void addOrder(Order order) {
        orders.add(order);
    }
    @Override
    public Iterator<Order> iterator() {
        return new OrderIterator();
    }
    private class OrderIterator implements Iterator<Order> {
        private int index;
        @Override
        public boolean hasNext() {
            return index < orders.size();
        }
        @Override
        public Order next() {
            if (hasNext()) {
                Order order = orders.get(index);
                index++;
                return order;
            } else {
                throw new IndexOutOfBoundsException("No more orders to iterate");
            }
        }
    }
}

在上面的代码中,我们使用了 Java 内置的Iterator接口来实现迭代器。在 OrderList 类中,我们重写了 iterator() 方法,返回了一个 OrderIterator 对象。在OrderIterator类中,我们实现了hasNext()next() 方法,其中 hasNext() 方法用于检查是否还有下一个订单,next() 方法用于返回当前的订单,并将迭代器指针向后移动一位。

最后,我们可以使用迭代器来遍历订单列表:


public class Client {
    public static void main(String[] args) throws Exception {
        OrderList orderList = new OrderList();
        orderList.addOrder(new Order("20230001", "2023-04-21 10:00:00", 100.00));
        orderList.addOrder(new Order("20230002", "2023-04-22 11:00:00", 200.00));
        orderList.addOrder(new Order("20230003", "2023-04-23 12:00:00", 300.00));
        Iterator<Order> iterator = orderList.iterator();
        while (iterator.hasNext()) {
            Order order = iterator.next();
            System.out.println(order.getOrderNumber() + " " + order.getOrderTime() + " " + order.getOrderAmount());
        }
    }
}

输出:

20230001 2023-04-21 10:00:00 100.0
20230002 2023-04-22 11:00:00 200.0
20230003 2023-04-23 12:00:00 300.0

结束语

设计模式其实并不难,大家在学习的时候一定要在理解的基础上去写代码,不要去背代码。下节给大家讲中介者模式~

本着把自己知道的都告诉大家,如果本文对您有所帮助,点赞+关注鼓励一下呗~

相关文章

项目源码(源码已更新 欢迎star⭐️)

Kafka 专题学习

项目源码(源码已更新 欢迎star⭐️)

ElasticSearch 专题学习

项目源码(源码已更新 欢迎star⭐️)

往期并发编程内容推荐

推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)

博客(阅读体验较佳)










相关文章
|
1月前
|
设计模式 Java 开发者
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin的用户,推荐查看“简洁”系列教程。本文重点介绍迭代器模式,通过具体示例展示了如何在Kotlin中实现迭代器模式,包括使用Iterator、Iterable接口及重载iterator运算符的方法。
28 4
|
1月前
|
设计模式 Java Kotlin
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
27 2
|
1月前
|
设计模式 Java 开发者
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
本教程详细讲解了Kotlin中的迭代器模式,包括如何通过实现Iterator和Iterable接口以及重载iterator运算符来实现可遍历的自定义集合。示例展示了如何创建一个图书集类,并通过不同方式使其支持遍历操作,适合希望深入了解Kotlin迭代器模式的开发者。
29 3
|
10天前
|
设计模式 Java Kotlin
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
18 0
|
1月前
|
设计模式 Java Kotlin
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
30 1
|
1月前
|
设计模式 Java Kotlin
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
26 1
|
2月前
|
设计模式 安全 Java
Java设计模式-迭代器模式(21)
Java设计模式-迭代器模式(21)
|
4月前
|
存储 NoSQL Go
iLogtail设计模式问题之迭代器模式是如何应用的
iLogtail设计模式问题之迭代器模式是如何应用的
|
4月前
|
设计模式 移动开发 JavaScript
js设计模式【详解】—— 迭代器模式
js设计模式【详解】—— 迭代器模式
30 0
|
5月前
|
设计模式 Java
Java设计模式之迭代器模式详解
Java设计模式之迭代器模式详解

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    54
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    62
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    57
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    41
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    106
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78