😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~
津津乐道设计模式 - 迭代器模式详解
- 什么是迭代器模式
- 迭代器模式适用场景
- 代码案例
- 迭代器模式优缺点
- 结语
什么是迭代器模式
迭代器模式(Iterator Pattern
)是一种行为型设计模式,它提供了一种访问容器对象中各个元素的方法,而无需暴露容器的内部结构。迭代器模式将遍历元素和访问元素的责任分离,使得代码更加简洁、灵活,并且符合开闭原则。
迭代器模式的核心思想是将容器对象的遍历操作封装在一个迭代器对象中,迭代器对象负责维护当前遍历的位置,并提供一系列方法来访问容器中的元素。这样,客户端可以通过迭代器对象来逐个访问容器中的元素,而不需要关心容器的具体实现细节。
迭代器模式适用场景
迭代器模式适用于以下场景:
-
需要遍历一个聚合对象(如列表、集合等)中的元素,但又不想暴露聚合对象的内部结构
-
需要对聚合对象提供多种不同的遍历方式
-
希望统一遍历不同聚合对象的接口
-
希望通过迭代器来封装对聚合对象的遍历,以简化客户端代码
迭代器模式可以提供一种统一的遍历方式,使得客户端代码与具体的聚合对象解耦,增加了代码的灵活性和可扩展性。它适用于需要遍历聚合对象中的元素,但不希望暴露聚合对象内部结构的情况。
代码案例
在JAVA开发中最常见的就是使用JDK自带的Iterator 遍历集合,也正是因为很多语言都把都将迭代器作为一个基础的类库直接提供出来了,我们可以直接使用。当然理解原理才能帮助我们更好的使用这些工具类
下面我们以一个购物车的场景来演示迭代器模式
假设我们现在有一个购物车,其中存放着各种商品。现在我们需要遍历购物车中的商品,并对它们进行一些操作,比如计算总价、查找特定商品等。这时,我们可以使用迭代器模式来实现这个场景。
首先,我们定义一个商品类(Product
)作为聚合对象中的元素:
// 商品类
class Product {
private String name;
private double price;
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
}
然后,我们定义一个迭代器接口(Iterator
),其中包含了遍历商品和访问商品的方法:
// 迭代器接口
interface Iterator {
boolean hasNext();
Product next();
}
接下来,我们定义购物车类(ShoppingCart
)作为聚合对象,实现迭代器接口,并提供一些方法来管理商品:
// 购物车类
class ShoppingCart implements Iterator {
private List<Product> products;
private int position;
public ShoppingCart(List<Product> products) {
this.products = products;
this.position = 0;
}
@Override
public boolean hasNext() {
return position < products.size();
}
@Override
public Product next() {
if (hasNext()) {
Product product = products.get(position);
position++;
return product;
}
return null;
}
// 其他购物车相关的方法...
}
现在,我们可以在客户端中使用购物车对象进行遍历和操作:
public class Client {
public static void main(String[] args) {
List<Product> products = new ArrayList<>();
products.add(new Product("手机", 999.99));
products.add(new Product("电视", 1999.99));
products.add(new Product("耳机", 99.99));
ShoppingCart shoppingCart = new ShoppingCart(products);
while (shoppingCart.hasNext()) {
Product product = shoppingCart.next();
System.out.println("商品:" + product.getName() + ",价格:" + product.getPrice());
}
}
}
在上述代码中,我们通过创建购物车对象,并使用迭代器接口的方法来遍历购物车中的商品。通过迭代器的hasNext方法判断是否还有下一个商品,通过next方法获取下一个商品。
通过使用迭代器模式,我们将购物车的遍历操作封装在迭代器中,客户端代码与购物车的具体实现解耦,增加了代码的灵活性和可维护性。同时,我们可以通过扩展迭代器接口,实现不同的遍历方式,提供更多的灵活性和功能。
迭代器模式优缺点
迭代器模式的优点:
-
简化了客户端代码:使用迭代器模式,客户端不需要关心聚合对象的内部结构,只需通过迭代器接口来遍历聚合对象的元素,简化了客户端代码。
-
提供了多种遍历方式:通过定义不同的迭代器,可以实现多种不同的遍历方式,如正序遍历、逆序遍历等,增加了灵活性。
-
封装了迭代器的实现:迭代器模式将迭代器的实现细节封装在聚合对象内部,客户端无需了解具体实现,使得聚合对象和迭代器对象的职责清晰分离。
-
支持对聚合对象的并发遍历:某些特定的迭代器实现可以支持对聚合对象的并发遍历,提高了代码的并发性和性能。
迭代器模式的缺点:
-
增加了类的数量:引入迭代器模式会增加迭代器接口和具体迭代器的实现类,可能会使得类的数量增多,增加了系统的复杂性。
-
遍历过程中修改聚合对象可能导致问题:如果在迭代过程中修改了聚合对象的结构,可能会导致迭代器的行为不可预测,需要在使用迭代器时注意避免这种情况。
-
迭代器模式适用于顺序访问的集合类型:如果聚合对象的内部结构发生变化,可能会导致迭代器的实现也需要相应修改。
迭代器模式适用于需要遍历聚合对象中的元素,并且希望将遍历操作和聚合对象的具体实现解耦的场景。在使用迭代器模式时需要权衡其优点和缺点,并根据具体场景来选择是否使用
结语
本章节主要介绍了迭代器模式、迭代器模式适用场景、迭代器模式的优缺点,并以购物车的场景来演示迭代器模式,如果本文对你有用,欢迎关注收藏评论,后续将陆续推出更多优质的博文与大家一起分享交流~