设计模式:生活中的迭代器模式

迭代器模式可以通过日常生活中的餐厅菜单遍历来类比。想象一下,你走进一家餐厅,服务员给了你一本菜单。这本菜单就像是一个聚合对象,它包含了各种菜品。你可以一页一页地翻阅菜单,这个翻阅的过程就像是使用迭代器来遍历聚合对象的元素。

生活场景类比

在这个类比中,菜单提供了一个统一的接口来遍历菜品,你不需要知道菜单是如何内部组织的,你只关心如何从头到尾查看菜单。这个过程就是迭代器模式的核心:提供一种方法来顺序访问聚合对象中的元素,而不暴露其内部的结构。

  • 菜单(聚合对象):餐厅提供的菜单,包含了一系列菜品。
  • 服务员(客户端代码):服务员提供给你菜单,并可能向你推荐某些菜品。
  • 你(迭代器用户):顾客使用菜单,一页一页地查看,决定点什么菜。
  • 翻页(迭代器的操作) :你翻阅菜单的动作,对应迭代器的 next() 操作。
  • 是否到菜单末尾的判断(迭代器的终止条件) :你检查是否翻到了菜单的最后一页,对应迭代器的 hasNext() 方法。

代码

如果我们把这个类比转换成代码,那么可以这样来实现:

java 复制代码
// 迭代器接口
interface Iterator<T> {
    boolean hasNext();
    T next();
}

// 菜单项
class MenuItem {
    private String name;
    private double price;

    public MenuItem(String name, double price) {
        this.name = name;
        this.price = price;
    }

    // Getter and setter methods...
}

// 菜单聚合接口
interface Menu {
    Iterator<MenuItem> createIterator();
}

// 具体的菜单类
class DinnerMenu implements Menu {
    private List<MenuItem> menuItems;

    public DinnerMenu() {
        menuItems = new ArrayList<>();
        // 添加一些菜品到菜单
        addItem("Vegetarian BLT", 2.99);
        addItem("BLT", 2.99);
        addItem("Soup of the day", 3.29);
        // 更多菜品...
    }

    public void addItem(String name, double price) {
        MenuItem menuItem = new MenuItem(name, price);
        menuItems.add(menuItem);
    }

    @Override
    public Iterator<MenuItem> createIterator() {
        return menuItems.iterator(); // 利用 Java 内置的迭代器
    }
}

// 客户端代码
public class MenuTestDrive {
    public static void main(String[] args) {
        Menu dinnerMenu = new DinnerMenu();
        Iterator<MenuItem> iterator = dinnerMenu.createIterator();

        while (iterator.hasNext()) {
            MenuItem item = iterator.next();
            System.out.println(item.getName() + ", $" + item.getPrice());
        }
    }
}

总结

通过餐厅菜单的类比,我们可以更深入地理解迭代器模式:

  • 隐藏复杂性:正如你不需要知道菜单是如何打印和组织的,迭代器模式隐藏了聚合对象的内部结构。
  • 统一接口:翻阅菜单的方式对所有餐厅都是一样的,迭代器模式提供了一个统一的接口来遍历不同的聚合结构。
  • 支持多种遍历:就像不同的菜单可能有不同的遍历方式(比如按菜系分类),迭代器模式也支持多种遍历聚合对象的方法。

迭代器模式强调了如何提供一个简单的接口来顺序访问一组对象,同时隐藏底层的数据结构和遍历的具体实现。正确应用迭代器模式可以使得代码更加灵活和可维护。

相关推荐
AI人工智能+电脑小能手9 小时前
大白话说Java设计模式-46-责任链模式(业务实战篇)
java·设计模式·责任链模式·风控校验·servlet filter·spring interceptor·链式处理
码匠许师傅1 天前
【设计模式精讲】7.建造者模式(Builder)
设计模式·建造者模式
码匠许师傅1 天前
【设计模式精讲】6.抽象工厂(Abstract Factory)
c++·设计模式
workflower2 天前
人形机器人灵巧手产业链
人工智能·设计模式·机器人·云计算·无人机
Java后端的Ai之路2 天前
03、Python - 抽象工厂模式
开发语言·python·设计模式·抽象工厂模式·通用智慧
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-45-解释器模式(源码剖析篇)
java·设计模式·解释器模式·源码分析·pattern·spel·javacc
码匠许师傅2 天前
【设计模式精讲】4.单例模式(Singleton)
c++·单例模式·设计模式
雾削木2 天前
2026 编程领域热点知识速览:AI 辅助开发、设计模式实战与嵌入式高效迭代
人工智能·设计模式
AI人工智能+电脑小能手3 天前
大白话说Java设计模式-42-访问者模式(业务实战篇)
java·spring·设计模式·访问者模式·asm·营销规则·数据结构与操作分离
AI人工智能+电脑小能手3 天前
大白话说Java设计模式-43-访问者模式(源码剖析篇)
java·设计模式·访问者模式·源码分析·elementvisitor·asm classvisitor·spring spel