迭代器设计模式

在这个例子中,我们将实现两个菜单,一个午餐菜单使用 ArrayList 实现,另一个早餐菜单使用数组实现。然后,使用迭代器模式遍历两个菜单,并将它们合并到一起,最后输出所有菜单项。

步骤:

  1. 创建迭代器接口:定义用于遍历集合的标准接口。
  2. 实现午餐菜单和早餐菜单类 :分别使用 ArrayList 和数组实现菜单。
  3. 创建迭代器实现类:实现菜单各自的迭代器。
  4. 实现菜单的遍历与合并

代码实现

1. 定义 Iterator 接口
java 复制代码
import java.util.Iterator;

public interface MenuIterator<T> {
    boolean hasNext();
    T next();
}
java 复制代码
public class MenuItem {
    private String name;
    private String description;
    private double price;

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

    public String getName() {
        return name;
    }
    
    public String getDescription() {
        return description;
    }

    public double getPrice() {
        return price;
    }

    @Override
    public String toString() {
        return name + ": " + description + " -- ¥" + price;
    }
}
3. 实现 LunchMenu 类,使用 ArrayList 存储菜单项
java 复制代码
import java.util.ArrayList;
import java.util.List;

public class LunchMenu {
    List<MenuItem> menuItems;

    public LunchMenu() {
        menuItems = new ArrayList<>();
        addItem("茄汁面", "番茄鸡蛋汤面", 8);
        addItem("蒜汁面", "凉拌面", 7);
        addItem("臊子面", "羊肉臊子面", 15);
    }

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

    public MenuIterator<MenuItem> createIterator() {
        return new LunchMenuIterator(menuItems);
    }
}
4. 实现 LunchMenuIterator
java 复制代码
import java.util.List;

public class LunchMenuIterator implements MenuIterator<MenuItem> {
    private List<MenuItem> items;
    private int position = 0;

    public LunchMenuIterator(List<MenuItem> items) {
        this.items = items;
    }

    @Override
    public boolean hasNext() {
        return position < items.size();
    }

    @Override
    public MenuItem next() {
        return items.get(position++);
    }
}
5. 实现 BreakfastMenu 类,使用数组存储菜单项
java 复制代码
public class BreakfastMenu {
    private static final int MAX_ITEMS = 5;
    private int numberOfItems = 0;
    private MenuItem[] menuItems;

    public BreakfastMenu() {
        menuItems = new MenuItem[MAX_ITEMS];
        addItem("胡辣汤", "素胡辣汤", 3);
        addItem("油条", "按斤称", 2);
        addItem("包子", " 莲藕馅", 1.5);
    }

    public void addItem(String name, String description, double price) {
        if (numberOfItems > MAX_ITEMS) {
            System.out.println("菜单满了,少吃点,不能添加了");
        } else {
            MenuItem menuItem = new MenuItem(name, description, price);
            menuItems[numberOfItems] = menuItem;
            numberOfItems++;
        }
    }

    public MenuIterator<MenuItem> createIterator() {
        return new BreakfastMenuIterator(menuItems);
    }
}
6. 实现 BreakfastMenuIterator
java 复制代码
public class BreakfastMenuIterator implements MenuIterator{
    private MenuItem[] items;
    private int position = 0;

    public BreakfastMenuIterator(MenuItem[] items) {
        this.items = items;
    }

    @Override
    public boolean hasNext() {
        return position < items.length && items[position] != null;
    }

    @Override
    public Object next() {
        return items[position++];
    }
}
7. 实现 Waitress 类用于遍历并打印合并后的菜单
java 复制代码
public class Waitress {
    BreakfastMenu breakfastMenu;
    LunchMenu launchMenu;

    public Waitress(BreakfastMenu breakfastMenu, LunchMenu launchMenu) {
        this.breakfastMenu = breakfastMenu;
        this.launchMenu = launchMenu;
    }

    public void printMenu(){
        MenuIterator<MenuItem> breakfastMenuIterator = breakfastMenu.createIterator();
        MenuIterator<MenuItem> launchMenuIterator = launchMenu.createIterator();

        System.out.println("\n早餐菜单:");
        printMenu(breakfastMenuIterator);

        System.out.println("午餐菜单");
        printMenu(launchMenuIterator);

    }
    public void printMenu(MenuIterator<MenuItem> iterator) {
        while (iterator.hasNext()) {
            MenuItem item = iterator.next();
            System.out.println(item);
        }
    }
}
8. 测试代码
java 复制代码
public class IteratorPatternDemo {
    public static void main(String[] args) {
        LunchMenu lunchMenu = new LunchMenu();
        BreakfastMenu breakfastMenu = new BreakfastMenu();

        Waitress waitress = new Waitress(breakfastMenu, lunchMenu);
        waitress.printMenu();
    }
}

输出结果

plaintext 复制代码
早餐菜单:
胡辣汤: 素胡辣汤 -- ¥3.0
油条: 按斤称 -- ¥2.0
包子:  莲藕馅 -- ¥1.5
午餐菜单
茄汁面: 番茄鸡蛋汤面 -- ¥8.0
蒜汁面: 凉拌面 -- ¥7.0
臊子面: 羊肉臊子面 -- ¥15.0

代码解释

  1. MenuIterator 接口 :自定义的迭代器接口,包含 hasNext()next() 方法,用于遍历菜单项。
  2. LunchMenuBreakfastMenu :分别使用 ArrayList 和数组实现菜单。两者都有一个 createIterator() 方法,返回相应的迭代器。
  3. LunchMenuIteratorBreakfastMenuIterator :分别实现了 MenuIterator 接口,用于遍历午餐和早餐菜单。
  4. Waitress:负责遍历午餐和早餐菜单并打印它们。
  5. IteratorPatternDemo:测试程序,创建午餐和晚、早餐菜单并打印出所有的菜单项。

总结

通过使用迭代器设计模式,我们可以轻松地遍历不同的菜单实现,并将它们合并输出,保持了代码的扩展性和灵活性,便于后续添加更多类型的菜单。

相关推荐
喵叔哟11 分钟前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
尘浮生17 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
闲人一枚(学习中)24 分钟前
设计模式-创建型-抽象工厂模式
设计模式·抽象工厂模式
不是二师兄的八戒41 分钟前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
爱编程的小生1 小时前
Easyexcel(2-文件读取)
java·excel
带多刺的玫瑰1 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
计算机毕设指导62 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
Gu Gu Study2 小时前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言
Chris _data2 小时前
二叉树oj题解析
java·数据结构
牙牙7052 小时前
Centos7安装Jenkins脚本一键部署
java·servlet·jenkins