前言
目前正在出一个设计模式专题
系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
本节给大家讲一下设计模式中的迭代器模式
,并结合实际业务场景给大家讲解如何使用~
本专题的所有案例代码主要以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 专题学习
- 一起来学kafka之Kafka集群搭建
- 一起来学kafka之整合SpringBoot基本使用
- 一起来学kafka之整合SpringBoot深入使用(一)
- 一起来学kafka之整合SpringBoot深入使用(二)
- 一起来学kafka之整合SpringBoot深入使用(三)
项目源码(源码已更新 欢迎star⭐️)
ElasticSearch 专题学习
- 利用docker搭建es集群
- 一起来学ElasticSearch(一)
- 一起来学ElasticSearch(二)
- 一起来学ElasticSearch(三)
- 一起来学ElasticSearch(四)
- 一起来学ElasticSearch(五)
- 一起来学ElasticSearch(六)
- 一起来学ElasticSearch(七)
- 一起来学ElasticSearch(八)
- 一起来学ElasticSearch(九)
- 一起来学ElasticSearch(十)
- 一起来学ElasticSearch之整合SpringBoot(一)
- 一起来学ElasticSearch之整合SpringBoot(二)
- 一起来学ElasticSearch之整合SpringBoot(三)
项目源码(源码已更新 欢迎star⭐️)
往期并发编程内容推荐
- Java多线程专题之线程与进程概述
- Java多线程专题之线程类和接口入门
- Java多线程专题之进阶学习Thread(含源码分析)
- Java多线程专题之Callable、Future与FutureTask(含源码分析)
- 面试官: 有了解过线程组和线程优先级吗
- 面试官: 说一下线程的生命周期过程
- 面试官: 说一下线程间的通信
- 面试官: 说一下Java的共享内存模型
- 面试官: 有了解过指令重排吗,什么是happens-before
- 面试官: 有了解过volatile关键字吗 说说看
- 面试官: 有了解过Synchronized吗 说说看
- Java多线程专题之Lock锁的使用
- 面试官: 有了解过ReentrantLock的底层实现吗?说说看
- 面试官: 有了解过CAS和原子操作吗?说说看
- Java多线程专题之线程池的基本使用
- 面试官: 有了解过线程池的工作原理吗?说说看
- 面试官: 线程池是如何做到线程复用的?有了解过吗,说说看
- 面试官: 阻塞队列有了解过吗?说说看
- 面试官: 阻塞队列的底层实现有了解过吗? 说说看
- 面试官: 同步容器和并发容器有用过吗? 说说看
- 面试官: CopyOnWrite容器有了解过吗? 说说看
- 面试官: Semaphore在项目中有使用过吗?说说看(源码剖析)
- 面试官: Exchanger在项目中有使用过吗?说说看(源码剖析)
- 面试官: CountDownLatch有了解过吗?说说看(源码剖析)
- 面试官: CyclicBarrier有了解过吗?说说看(源码剖析)
- 面试官: Phaser有了解过吗?说说看
- 面试官: Fork/Join 有了解过吗?说说看(含源码分析)
- 面试官: Stream并行流有了解过吗?说说看
推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)
- springboot-all
地址
: github.com/qiuChenglei…- SpringBoot系列教程合集
- 一起来学SpringCloud合集
- SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 实现授权码模式的服务认证(一)
- SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 实现授权码模式的服务认证(二)