迭代器模式(迭代器模式1)

迭代器模式:两个不同的数据结构,可以组合成可用的数据结构。

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

场景:

有两家餐厅,共有两个菜单,两家准备合并,每个餐厅都有一个销售系统,但是内部菜单的组成结构稍有不同,一个是用数组存储菜单对象,一个是用集合存储菜单对象

需求:

将两家菜单合并一个菜单

菜单函数代码:

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();
    }
}

猜你喜欢

转载自www.cnblogs.com/java214/p/11800569.html