这篇系列文章将按照以下结构逐一介绍不同种类的设计模式:
1. 创建型模式
2. 结构型模式
3. 行为型模式
- 行为型模式涉及类和对象之间的协作,以完成单个对象无法独立完成的任务,并分配职责。这部分将介绍十一种行为型模式:模板方法模式、策略模式、命令模式、责任链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式和解释器模式。
通过这一系列文章,深入了解这些不同类型的设计模式,以及它们如何在软件开发中发挥关键作用。
前言
在软件开发中,设计模式是一种被广泛接受的可复用解决方案,用于解决在软件设计中常见的问题。设计模式为开发人员提供了一种通用的指导,帮助他们设计和实施高质量、易维护、可扩展的软件系统。
本文将快速入门行为型模设计模式中的迭代器模式。
一、迭代器模式简介
1.1 什么是迭代器模式?
迭代器模式是一种设计模式,它提供了一种方法来访问一个容器对象(如列表、数组等)中的各个元素,而又不暴露该对象的内部表示。通过使用迭代器,我们可以在不知道底层数据结构的情况下遍历容器中的元素。
1.2 为什么需要迭代器模式(优点)
- 封装性:迭代器模式将遍历逻辑封装在迭代器类中,客户端不需要关心底层的数据结构,只需要调用迭代器的接口即可完成遍历操作。
- 灵活性:由于客户端不需要知道底层的数据结构,因此可以在不修改原有代码的情况下,方便地更换底层的数据结构。
- 扩展性:如果需要添加新的遍历逻辑,只需要实现一个新的迭代器类即可,而不需要修改原有的代码。
1.3 迭代器模式的不足
- 增加了系统的复杂性:由于需要实现迭代器接口和具体的迭代器类,使得系统的复杂性增加。
- 性能开销:每次请求下一个元素时,都需要调用
hasNext()
和next()
方法,可能会带来一定的性能开销。
1.4 迭代器模式的结构
迭代器模式主要包括以下几个角色:
迭代器接口(Iterator):定义了访问和遍历聚合对象元素的方法。
具体迭代器(Concrete Iterator):实现迭代器接口,负责具体的遍历操作。
聚合对象接口(Aggregate):定义了创建迭代器对象的方法。
具体聚合对象(Concrete Aggregate):实现聚合对象接口,负责创建具体的迭代器对象。
1.5 迭代器模式的应用场景
迭代器模式适用于以下场景:
- 需要遍历一个容器对象中的所有元素,但又不想暴露该容器的内部表示。
- 需要为一个容器对象提供多种遍历方式。
- 需要在不同的应用环境中使用相同的遍历逻辑,但底层的数据结构可能不同。
迭代器模式的应用场景包括:
遍历集合:迭代器模式可以用于遍历集合中的元素,例如遍历一个数组、链表或者树的节点。
数据库查询:在数据库查询中,可以使用迭代器模式来遍历查询结果集,逐个获取每条记录。
文件系统遍历:在文件系统中,可以使用迭代器模式来遍历文件夹和文件,逐个获取每个文件的信息。
游戏中的角色管理:在游戏中,可以使用迭代器模式来管理游戏中的角色,例如遍历所有角色并执行相应的操作。
菜单管理:在一个餐厅的菜单管理系统中,可以使用迭代器模式来遍历菜单,逐个获取每个菜品的信息。
二、迭代器模式的示例
我们以奶茶店作为案例,使用迭代器模式来遍历奶茶菜单。
首先,我们需要创建一个奶茶类(MilkTea
),然后创建一个奶茶菜单类(Menu
),最后实现一个迭代器接口(Iterator
)。
以下是示例代码:
// 奶茶类
class MilkTea {
private String name;
private double price;
public MilkTea(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
}
// 奶茶菜单类
class Menu implements Iterable<MilkTea> {
private List<MilkTea> milkTeas;
public Menu() {
milkTeas = new ArrayList<>();
}
public void addMilkTea(MilkTea milkTea) {
milkTeas.add(milkTea);
}
@Override
public Iterator<MilkTea> iterator() {
return new MenuIterator();
}
private class MenuIterator implements Iterator<MilkTea> {
private int currentIndex;
public MenuIterator() {
currentIndex = 0;
}
@Override
public boolean hasNext() {
return currentIndex < milkTeas.size();
}
@Override
public MilkTea next() {
return milkTeas.get(currentIndex++);
}
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Menu menu = new Menu();
menu.addMilkTea(new MilkTea("珍珠奶茶", 10));
menu.addMilkTea(new MilkTea("椰果奶茶", 12));
menu.addMilkTea(new MilkTea("芋圆奶茶", 14));
Iterator<MilkTea> iterator = menu.iterator();
while (iterator.hasNext()) {
MilkTea milkTea = iterator.next();
System.out.println("奶茶名称:" + milkTea.getName() +
",价格:" + milkTea.getPrice());
}
}
}
运行结果:
奶茶名称:珍珠奶茶,价格:10.0
奶茶名称:椰果奶茶,价格:12.0
奶茶名称:芋圆奶茶,价格:14.0
总结
迭代器模式适用于需要遍历集合或者序列的场景,可以提供一种统一的方式来访问集合中的元素。