一、迭代器模式
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
二、举例
合并一个餐厅菜单和煎饼屋菜单,要求如下
- 餐厅菜单用数组存储菜单项
- 煎饼屋用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;
}
@Override
public boolean hasNext() {
if (this.position >= this.items.length || this.items[position] == null) {
return false;
}
return true;
}
@Override
public 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;
}
@Override
public boolean hasNext() {
if (this.position >= this.items.size() || this.items.get(this.position) == null) {
return false;
}
return true;
}
@Override
public 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++;
}
}
@Override
public 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;
}
@Override
public boolean hasNext() {
if (this.position >= this.items.length || this.items[position] == null) {
return false;
}
return true;
}
@Override
public 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);
}
@Override
public 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);
}
@Override
public 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();
}
}