迭代器模式:两个不同的数据结构,可以组合成可用的数据结构。
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示
场景:
有两家餐厅,共有两个菜单,两家准备合并,每个餐厅都有一个销售系统,但是内部菜单的组成结构稍有不同,一个是用数组存储菜单对象,一个是用集合存储菜单对象
需求:
将两家菜单合并一个菜单
菜单函数代码:
package com.java214.iteratormode; public class MenuItem { private String name,description;//名称和描述 private boolean vegetable;//蔬菜 private float price;//价格 public MenuItem(String name,String description,boolean vegetable,float price) { this.name=name; this.description=description; this.vegetable=vegetable; this.price=price; } public String getName() { return name; } public String getDescription() { return description; } public float getPrice() { return price; } public boolean isVegetable() { return vegetable; } }
集合菜单:
package com.java214.iteratormode; import java.util.ArrayList; /** * <p>Title: CakeHouseMenu</p> * <p>Description: 集合菜单</p> * @author 滕一帆 * @date 2019年11月5日 */ public class CakeHouseMenu { private ArrayList<MenuItem> menuItems;//定义集合菜单 public CakeHouseMenu() { menuItems = new ArrayList<MenuItem>();//创建实例 addItem("KFC蛋糕早餐","蛋挞+吐司+汉堡包",true,3.99f); addItem("MDL蛋糕早餐","水果鸡蛋+吐司",false,3.59f); addItem("草莓蛋糕","新鲜草莓",true,3.29f); addItem("甜蛋糕","吐司+糖",true,2.59f); //将菜单全部放入菜单参数中 } //添加参数 private void addItem(String name, String description, boolean vegetable, float price) { MenuItem menuItem = new MenuItem(name, description, vegetable, price);//创建菜单实例 menuItems.add(menuItem);//放入菜单函数集合中 } //获取菜单函数集合列表 public ArrayList<MenuItem> getMenuItems() { return menuItems; } //其他功能代码 }
数组菜单:
package com.java214.iteratormode; import java.util.ArrayList; /** * <p>Title: DinerMenu</p> * <p>Description:数组菜单 </p> * @author 滕一帆 * @date 2019年11月5日 */ public class DinerMenu { private final static int Max_Items=5;//最大参数值 public int numberOfItems=0;//数据 private MenuItem[] menuItems;//数组菜单参数 public DinerMenu() {//构造函数 menuItems=new MenuItem[Max_Items] ;//创建数组实例 addItem("玫瑰蛋糕","玫瑰花+奶油+面粉",true,3.58f); addItem("奶油蛋糕","奶油+面粉",false,3.00f); addItem("武大郎披萨","蔬菜+面粉+调料",true,3.28f); addItem("芝士饼","洋葱+蒜蓉+羊排",false,3.05f); //上面4个是自己定义的添加参数方法 } //添加参数 private void addItem(String name, String description, boolean vegetable, float price) { MenuItem menuItem = new MenuItem(name, description, vegetable, price);//创建菜单函数实例 if(numberOfItems>=Max_Items)//判断不是是大于=最大值 { System.err.println("对不起,菜单已满!无法添加参数");//如果是,不好意思无法添加了,数据已经满了 }else{ menuItems[numberOfItems]=menuItem;//不是就让该数据和实例数据传递 numberOfItems++;//进行数据叠加 } } //获取菜单函数 public MenuItem[] getMenuItems() { return menuItems; } }
添加一个女服务员,通过女服务员让这两家菜单合二为一:
package com.java214.iteratormode; import java.util.ArrayList; /** * <p>Title: Waitress</p> * <p>Description: 女招待员</p> * @author 滕一帆 * @date 2019年11月5日 */ public class Waitress { private CakeHouseMenu mCakeHouseMenu;//定义蛋糕房菜单 private DinerMenu mDinerMenu;//定义中餐菜单 private ArrayList<MenuItem> cakeitems;//定义集合菜单 private MenuItem[] dineritems;//定义数组菜单函数 public Waitress() { mCakeHouseMenu = new CakeHouseMenu(); cakeitems = mCakeHouseMenu.getMenuItems(); mDinerMenu = new DinerMenu(); dineritems = mDinerMenu.getMenuItems(); } //两者合二为一输出数据 public void printMenu() { MenuItem menuItem; for (int i = 0, len = cakeitems.size(); i < len; i++) { menuItem = cakeitems.get(i); System.out.println(menuItem.getName() + "***" +menuItem.getPrice()+"***"+ menuItem.getDescription()); } for (int i = 0, len = mDinerMenu.numberOfItems; i < len; i++) { menuItem = dineritems[i]; System.out.println(menuItem.getName() + "***" +menuItem.getPrice()+"***"+ menuItem.getDescription()); } //使用两个for循环进行组合两个数据结构不一致的菜单 } public void printBreakfastMenu() { } public void printLunchMenu() { } public void printVegetableMenu() { } }
最后测试:
package com.java214.iteratormode; /** * <p>Title: MainTest</p> * <p>Description: 运行结果</p> * @author 滕一帆 * @date 2019年11月5日 */ public class MainTest { public static void main(String[] args) { Waitress mWaitress=new Waitress(); mWaitress.printMenu(); } }