迭代器模式

  • 一、迭代器模式
  • 二、举例
    • 自定义迭代器
    • Java内置迭代器

一、迭代器模式

提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

二、举例

合并一个餐厅菜单和煎饼屋菜单,要求如下

  • 餐厅菜单用数组存储菜单项
  • 煎饼屋用ArrayList存储菜单项
  • 女服务员需要遍历餐馆的所有菜单

自定义迭代器

迭代器接口类

package com.jackeys.IteratorMode.DIY;/*** @Description: 迭代器接口* @ClassName: Iterator* @Package com.jackeys.IteratorMode.DIY* @Author: Jackeys 1623427047@qq.com* @Copyright 版权归Jackeys企业(或个人)所有* @CreateTime: 2021/10/24 7:40* @Version: 1.0*/
public interface Iterator {boolean hasNext();Object next();
}

菜单项类

package com.jackeys.IteratorMode.DIY;/*** @Description: 菜单项类* @ClassName: MenuItem* @Package com.jackeys.IteratorMode.DIY* @Author: Jackeys 1623427047@qq.com* @Copyright 版权归Jackeys企业(或个人)所有* @CreateTime: 2021/10/24 7:35* @Version: 1.0*/
public class MenuItem {/*** 菜名*/private String name;/*** 描述*/private String description;/*** 是否为素食*/private boolean vegetarian;/*** 价格*/private double price;public MenuItem(String name, String description, boolean vegetarian, double price) {this.name = name;this.description = description;this.vegetarian = vegetarian;this.price = price;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public boolean isVegetarian() {return vegetarian;}public void setVegetarian(boolean vegetarian) {this.vegetarian = vegetarian;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}
}

餐厅菜单类

package com.jackeys.IteratorMode.DIY;/*** @Description: 餐厅菜单类* @ClassName: DinerMenu* @Package com.jackeys.IteratorMode.DIY* @Author: Jackeys 1623427047@qq.com* @Copyright 版权归Jackeys企业(或个人)所有* @CreateTime: 2021/10/24 8:03* @Version: 1.0*/
public class DinerMenu {private static final int MAX_ITEMS = 6;private int numberOfItem = 0;private MenuItem[] menuItems;public DinerMenu() {this.menuItems = new MenuItem[MAX_ITEMS];this.addItem("战斧牛排","威武霸气的战斧配上鲜嫩多汁的牛排",false, 39.99);this.addItem("蜜汁手扒饭", "采用蜜汁酱料,手工拌饭",false, 19.99);this.addItem("例汤", "蔬菜例汤,爽口", true, 10.99);this.addItem("香辣鸡腿","鲜肥多汁,香酥脆口", false, 15.99);}/*** @MethodName: addItem* @Description: 添加菜单项* @Param name* @Param description* @Param vegetarian* @Param price* @Return void* @Auther: Jackeys 1623427947@qq.com* @Date: 2021/10/24 8:08* @Version: 1.0*/public void addItem(String name, String description, boolean vegetarian, double price) {MenuItem menuItem = new MenuItem(name, description, vegetarian, price);if (this.numberOfItem >= MAX_ITEMS) {System.out.println("很抱歉,餐厅菜单已满");} else {this.menuItems[this.numberOfItem] = menuItem;this.numberOfItem++;}}public Iterator createIterator() {return new DinerMenuIterator(this.menuItems);}
}

餐厅迭代器类

package com.jackeys.IteratorMode.DIY;/*** @Description: 餐厅迭代器类* @ClassName: DinerMenuIterator* @Package com.jackeys.IteratorMode.DIY* @Author: Jackeys 1623427047@qq.com* @Copyright 版权归Jackeys企业(或个人)所有* @CreateTime: 2021/10/24 7:43* @Version: 1.0*/
public class DinerMenuIterator implements Iterator {private MenuItem[] items;private int position = 0;public DinerMenuIterator(MenuItem [] items) {this.items = items;}@Overridepublic boolean hasNext() {if (this.position >= this.items.length || this.items[position] == null) {return false;}return true;}@Overridepublic Object next() {MenuItem menuItem = this.items[this.position];this.position++;return menuItem;}
}

煎饼屋菜单类

package com.jackeys.IteratorMode.DIY;import java.util.ArrayList;
import java.util.Arrays;/*** @Description: 煎饼屋菜单类* @ClassName: PancakeHouseMenu* @Package com.jackeys.IteratorMode.DIY* @Author: Jackeys 1623427047@qq.com* @Copyright 版权归Jackeys企业(或个人)所有* @CreateTime: 2021/10/24 7:48* @Version: 1.0*/
public class PancakeHouseMenu {private ArrayList<MenuItem> menuItems;public PancakeHouseMenu() {this.menuItems = new ArrayList<>();this.addItem("特色煎饼", "本店特色煎饼,不好吃不要钱",true, 5.99d);this.addItem("麻辣煎饼", "又麻又辣,太上头", true, 4.99d);this.addItem("田园煎饼", "新鲜甘甜,健康美味",true, 4.99d);this.addItem("肉丝煎饼","大口煎饼,大份满足",false,6.99d);}/*** @MethodName: addItem* @Description: 添加菜单项* @Param name* @Param description* @Param vegetarian* @Param price* @Return void* @Auther: Jackeys 1623427947@qq.com* @Date: 2021/10/24 7:51* @Version: 1.0*/public void addItem(String name, String description, boolean vegetarian, double price) {MenuItem menuItem = new MenuItem(name, description, vegetarian, price);this.menuItems.add(menuItem);}public Iterator createIterator() {return new PancakeHouseMenuIterator(this.menuItems);}
}

煎饼屋迭代器类

package com.jackeys.IteratorMode.DIY;import java.util.ArrayList;/*** @Description: 煎饼屋迭代器* @ClassName: PancakeHouseMenuIterator* @Package com.jackeys.IteratorMode.DIY* @Author: Jackeys 1623427047@qq.com* @Copyright 版权归Jackeys企业(或个人)所有* @CreateTime: 2021/10/24 7:58* @Version: 1.0*/
public class PancakeHouseMenuIterator implements Iterator {private ArrayList<MenuItem> items;private int position = 1;public PancakeHouseMenuIterator(ArrayList<MenuItem> items) {this.items = items;}@Overridepublic boolean hasNext() {if (this.position >= this.items.size() || this.items.get(this.position) == null) {return false;}return true;}@Overridepublic Object next() {MenuItem menuItem = this.items.get(this.position);this.position++;return menuItem;}
}

女服务员类

package com.jackeys.IteratorMode.DIY;/*** @Description: 女服务员* @ClassName: Waitress* @Package com.jackeys.IteratorMode.DIY* @Author: Jackeys 1623427047@qq.com* @Copyright 版权归Jackeys企业(或个人)所有* @CreateTime: 2021/10/24 8:15* @Version: 1.0*/
public class Waitress {/*** 煎饼屋菜单*/private PancakeHouseMenu pancakeHouseMenu;/*** 餐厅菜单*/private DinerMenu dinerMenu;public Waitress(PancakeHouseMenu pancakeHouseMenu, DinerMenu dinerMenu) {this.pancakeHouseMenu = pancakeHouseMenu;this.dinerMenu = dinerMenu;}/*** @MethodName: printMenu* @Description: 打印菜单* @Return void* @Auther: Jackeys 1623427947@qq.com* @Date: 2021/10/24 8:19* @Version: 1.0*/public void printMenu() {Iterator pancakeHouseIterator = this.pancakeHouseMenu.createIterator();Iterator dinerMenuIterator = this.dinerMenu.createIterator();System.out.println("==================煎饼屋菜单================");this.printMenu(pancakeHouseIterator);System.out.println("==================餐厅菜单================");this.printMenu(dinerMenuIterator);}public void printMenu(Iterator iterator) {while (iterator.hasNext()) {MenuItem menuItem = (MenuItem) iterator.next();System.out.println("菜名:" + menuItem.getName() + "\n" + "描述:" + menuItem.getDescription() + "\n" + "是否为素食:" + menuItem.isVegetarian() + "\n" + "价格:" + menuItem.getPrice() + "元");}}}

测试

package com.jackeys.IteratorMode.DIY;/*** @Description: 测试迭代器模式* @ClassName: Test* @Package com.jackeys.IteratorMode.DIY* @Author: Jackeys 1623427047@qq.com* @Copyright 版权归Jackeys企业(或个人)所有* @CreateTime: 2021/10/24 8:26* @Version: 1.0*/
public class Test {public static void main(String[] args) {PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();DinerMenu dinerMenu = new DinerMenu();Waitress waitress = new Waitress(pancakeHouseMenu, dinerMenu);waitress.printMenu();}
}

运行截图

Java内置迭代器

菜单接口类

package com.jackeys.IteratorMode.JavaInner;import java.util.Iterator;/*** @Description: 菜单接口类* @ClassName: Menu* @Package com.jackeys.IteratorMode.JavaInner* @Author: Jackeys 1623427047@qq.com* @Copyright 版权归Jackeys企业(或个人)所有* @CreateTime: 2021/10/24 8:37* @Version: 1.0*/
public interface Menu {Iterator createIterator();
}

餐厅菜单类

package com.jackeys.IteratorMode.JavaInner;import com.jackeys.IteratorMode.JavaInner.DinerMenuIterator;
import com.jackeys.IteratorMode.JavaInner.MenuItem;import java.util.Iterator;/*** @Description: 餐厅菜单类* @ClassName: DinerMenu* @Package com.jackeys.IteratorMode.DIY* @Author: Jackeys 1623427047@qq.com* @Copyright 版权归Jackeys企业(或个人)所有* @CreateTime: 2021/10/24 8:03* @Version: 1.0*/
public class DinerMenu implements Menu{private static final int MAX_ITEMS = 6;private int numberOfItem = 0;private MenuItem[] menuItems;public DinerMenu() {this.menuItems = new MenuItem[MAX_ITEMS];this.addItem("战斧牛排","威武霸气的战斧配上鲜嫩多汁的牛排",false, 39.99);this.addItem("蜜汁手扒饭", "采用蜜汁酱料,手工拌饭",false, 19.99);this.addItem("例汤", "蔬菜例汤,爽口", true, 10.99);this.addItem("香辣鸡腿","鲜肥多汁,香酥脆口", false, 15.99);}/*** @MethodName: addItem* @Description: 添加菜单项* @Param name* @Param description* @Param vegetarian* @Param price* @Return void* @Auther: Jackeys 1623427947@qq.com* @Date: 2021/10/24 8:08* @Version: 1.0*/public void addItem(String name, String description, boolean vegetarian, double price) {MenuItem menuItem = new MenuItem(name, description, vegetarian, price);if (this.numberOfItem >= MAX_ITEMS) {System.out.println("很抱歉,餐厅菜单已满");} else {this.menuItems[this.numberOfItem] = menuItem;this.numberOfItem++;}}@Overridepublic Iterator createIterator() {return new DinerMenuIterator(this.menuItems);}
}

餐厅迭代器类

package com.jackeys.IteratorMode.JavaInner;import com.jackeys.IteratorMode.JavaInner.MenuItem;import java.util.Iterator;/*** @Description: 餐厅迭代器类* @ClassName: DinerMenuIterator* @Package com.jackeys.IteratorMode.DIY* @Author: Jackeys 1623427047@qq.com* @Copyright 版权归Jackeys企业(或个人)所有* @CreateTime: 2021/10/24 7:43* @Version: 1.0*/
public class DinerMenuIterator implements Iterator {private MenuItem[] items;private int position = 0;public DinerMenuIterator(MenuItem [] items) {this.items = items;}@Overridepublic boolean hasNext() {if (this.position >= this.items.length || this.items[position] == null) {return false;}return true;}@Overridepublic Object next() {MenuItem menuItem = this.items[this.position];this.position++;return menuItem;}
}

咖啡菜单类

package com.jackeys.IteratorMode.JavaInner;import java.util.Hashtable;
import java.util.Iterator;/*** @Description: 咖啡菜单* @ClassName: CafeMenu* @Package com.jackeys.IteratorMode.JavaInner* @Author: Jackeys 1623427047@qq.com* @Copyright 版权归Jackeys企业(或个人)所有* @CreateTime: 2021/10/24 8:40* @Version: 1.0*/
public class CafeMenu implements Menu{private Hashtable<String, MenuItem> menuItems;public CafeMenu() {this.menuItems = new Hashtable<>();this.addItem("现磨咖啡","新鲜的味道",true,9.99d);this.addItem("意大利咖啡","来自意大利的风味",true,8.99d);this.addItem("浓缩咖啡","快速冲泡",true,5.99d);this.addItem("猫屎咖啡","高贵美味",true,10.99d);}/*** @MethodName: addItem* @Description: 添加菜单项* @Return void* @Auther: Jackeys 1623427947@qq.com* @Date: 2021/10/24 8:43* @Version: 1.0*/public void addItem(String name, String description, boolean vegetarian, double price) {MenuItem menuItem = new MenuItem(name, description, vegetarian, price);this.menuItems.put(menuItem.getName(), menuItem);}@Overridepublic Iterator createIterator() {return this.menuItems.values().iterator();}
}

煎饼屋菜单类

package com.jackeys.IteratorMode.JavaInner;import com.jackeys.IteratorMode.JavaInner.MenuItem;import java.util.ArrayList;
import java.util.Iterator;/*** @Description: 煎饼屋菜单类* @ClassName: PancakeHouseMenu* @Package com.jackeys.IteratorMode.DIY* @Author: Jackeys 1623427047@qq.com* @Copyright 版权归Jackeys企业(或个人)所有* @CreateTime: 2021/10/24 7:48* @Version: 1.0*/
public class PancakeHouseMenu implements Menu{private ArrayList<MenuItem> menuItems;public PancakeHouseMenu() {this.menuItems = new ArrayList<>();this.addItem("特色煎饼", "本店特色煎饼,不好吃不要钱",true, 5.99d);this.addItem("麻辣煎饼", "又麻又辣,太上头", true, 4.99d);this.addItem("田园煎饼", "新鲜甘甜,健康美味",true, 4.99d);this.addItem("肉丝煎饼","大口煎饼,大份满足",false,6.99d);}/*** @MethodName: addItem* @Description: 添加菜单项* @Param name* @Param description* @Param vegetarian* @Param price* @Return void* @Auther: Jackeys 1623427947@qq.com* @Date: 2021/10/24 7:51* @Version: 1.0*/public void addItem(String name, String description, boolean vegetarian, double price) {MenuItem menuItem = new MenuItem(name, description, vegetarian, price);this.menuItems.add(menuItem);}@Overridepublic Iterator createIterator() {return this.menuItems.iterator();}
}

女服务员类

package com.jackeys.IteratorMode.JavaInner;import java.util.Iterator;/*** @Description: 女服务员* @ClassName: Waitress* @Package com.jackeys.IteratorMode.DIY* @Author: Jackeys 1623427047@qq.com* @Copyright 版权归Jackeys企业(或个人)所有* @CreateTime: 2021/10/24 8:15* @Version: 1.0*/
public class Waitress {/*** 煎饼屋菜单*/private Menu pancakeHouseMenu;/*** 餐厅菜单*/private Menu dinerMenu;/*** 咖啡菜单*/private Menu cafeMenu;public Waitress(Menu pancakeHouseMenu,Menu dinerMenu, Menu cafeMenu) {this.pancakeHouseMenu = pancakeHouseMenu;this.dinerMenu = dinerMenu;this.cafeMenu = cafeMenu;}/*** @MethodName: printMenu* @Description: 打印菜单* @Return void* @Auther: Jackeys 1623427947@qq.com* @Date: 2021/10/24 8:19* @Version: 1.0*/public void printMenu() {Iterator pancakeHouseIterator = this.pancakeHouseMenu.createIterator();Iterator dinerMenuIterator = this.dinerMenu.createIterator();Iterator cafeMenuIterator = this.cafeMenu.createIterator();System.out.println("==================煎饼屋菜单(早餐)================");this.printMenu(pancakeHouseIterator);System.out.println("==================餐厅菜单(中餐)================");this.printMenu(dinerMenuIterator);System.out.println("==================咖啡菜单(晚餐)================");this.printMenu(cafeMenuIterator);}public void printMenu(Iterator iterator) {while (iterator.hasNext()) {MenuItem menuItem = (MenuItem) iterator.next();System.out.println("菜名:" + menuItem.getName() + "\n" + "描述:" + menuItem.getDescription() + "\n" + "是否为素食:" + menuItem.isVegetarian() + "\n" + "价格:" + menuItem.getPrice()+ "元");System.out.println("------------------------------------");}}}

测试

package com.jackeys.IteratorMode.JavaInner;/*** @Description: 测试JAVA内置Iterator* @ClassName: Test* @Package com.jackeys.IteratorMode.JavaInner* @Author: Jackeys 1623427047@qq.com* @Copyright 版权归Jackeys企业(或个人)所有* @CreateTime: 2021/10/24 8:49* @Version: 1.0*/
public class Test {public static void main(String[] args) {Menu cafeMenu = new CafeMenu();Menu dinerMenu = new DinerMenu();Menu pancakeHouseMenu = new PancakeHouseMenu();Waitress waitress = new Waitress(pancakeHouseMenu, dinerMenu, cafeMenu);waitress.printMenu();}
}

你知道迭代器模式吗?相关推荐

  1. 设计模式之迭代器模式(Iterator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  2. 设计模式笔记(18)---迭代器模式(行为型)

    Gof定义 提供一种方法顺序访问一个聚合对象中的各个元素, 而又不暴露该对象的内部表示. 动机 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可 ...

  3. 21Iterator(迭代器)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.Iterator(迭代器)模式动机 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以 ...

  4. 迭代器模式(Iterator pattern)

    一. 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生.我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator(); w ...

  5. 设计模式(十五):Iterator迭代器模式 -- 行为型模式

    1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...

  6. 设计模式学习总结-迭代器模式(Iterator Pattern)

    问题: 在面向对象的软件设计中,经常会遇到一些聚集对象,按一定的顺序的遍历访问问题,这个遍历算法究竟应该由谁来实现呢,聚集对象本身?这样聚集对象承受了过多的功能,不仅要维护聚集对象内的元素,还要提供遍 ...

  7. 结合项目实例 回顾传统设计模式(九)迭代器模式

    关于迭代器模式,我们所需要知道的第一件事情就是它依赖于一个名为迭代器的接口.一旦我们有了这个接口,就可以为各种那个对象集合实现迭代器:数组.列表.散列表. 项目实例我们就拿用户角色模块来举例 背景 1 ...

  8. java迭代器的使用场景_集合遍历利器 -- 迭代器模式 介绍 使用场景案例 优缺点及程序演示...

    一句话概括: 顺序访问集合对象的元素,不需要知道集合对象的底层表示. 补充介绍: 迭代器模式(Iterator Pattern)相信大家都已经见过不少次了,当你学习Java或者其他编程语言的开始你就会 ...

  9. Java设计模式(访问者模式-迭代器模式-观察者模式-中介者模式)

    Java设计模式Ⅶ 1.访问者模式 1.1 访问者模式概述 1.2 代码理解 2.迭代器模式 2.1 迭代器模式概述 2.2 代码理解 3.观察者模式 3.1 观察者模式概述 3.2 代码理解 4.中 ...

  10. 设计模式学习笔记(八:迭代器模式)

    1.1概述 提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露对象的内部表示.这就是迭代器模式的定义. 合理组织数据的结构以及相关操作是程序设计的一个重要方面,比如在程序设计中经常会使用诸如 ...

最新文章

  1. Android使用RxJava+Retrofit2+Okhttp+MVP练习的APP
  2. 25个创意的交互式图表设计欣赏
  3. mysql引擎测试_MySQL MyISAM引擎和InnoDB引擎的性能测试
  4. Python机器学习:多项式回归与模型泛化003过拟合与欠拟合
  5. 【转】基于easyui开发Web版Activiti流程定制器详解(一)——目录结构
  6. 2020 年 AI 产业报告:100 个岗位抢 1 个人,计算机视觉成最大缺口
  7. MFC DoDataExchange()绑定技术
  8. 一个SAP顾问在美国的这些年
  9. 内网隐蔽隧道之DNS隧道搭建(iodine)
  10. 【转】巧舟的逆转裁判开发手记~
  11. SEM竞价|这5个方面重要性你理解透没有?
  12. 1359: 最大公约数
  13. 如何减小电压跟随器输出电阻_逐次比较式模数转换器如何获取最佳采样频率
  14. npm install 报错 Failed at the XXX install script
  15. いくつかの愛に心が飛作者が恋しい
  16. 分享新手电商(淘宝、拼多多、楚楚街)上货经验
  17. ubuntu20.04未找到Wi-Fi适配器
  18. 全球唯一棕色熊猫 据科学记载全世界仅发现五只
  19. 第三章:进程线程模型
  20. Aspose.Words 通过书签导出数据

热门文章

  1. 后缀为.ppt和.pps的文件无法选择打开方式
  2. GitHub上最火爆!码代码不得不知的所有定律法则
  3. 用于类不平衡数据的随机森林分位数分类器
  4. 马哲对学习生活的启示
  5. VMware 虚拟机迁移
  6. python输入一个英文句子、翻转句子中单词的顺序_H面试程序(4):翻转句子中单词的顺序 ....
  7. 网页文件是用html语言创建的文本文件,HTML超文本标记语言,用它编写的文件(文档)的扩展名是.ppt...
  8. 解决ajax跨域问题的5种解决方案
  9. 和慧眼显示服务器网关错误,R525G3联想万全慧眼高级版用户指南.pdf
  10. 红魔7Pro参数配置