迭代器和组合模式

迭代器模式

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示
迭代器模式让我们能游走于聚合内的每一个元素,而又不暴露其内部的表示。
把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让责任各得其所。

代码

/**
 * 菜单类
 * 定义 菜单名称、描述、是否为素食和价格
 *
 */
public class MenuItem {

    String name;
    String description;
    //是否为素食标识
    Boolean vegetarian;
    double price ;
    public MenuItem(String name, String description, Boolean vegetarian, double price) {
        super();
        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 getVegetarian() {
        return vegetarian;
    }
    public void setVegetarian(Boolean vegetarian) {
        this.vegetarian = vegetarian;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }

}
/**
 * @author lzlj21@163.com
 * 
 * 这是一个简单接口,让客户能够取得一个菜单项迭代器
 *
 */
public interface Menu {

    public Iterator createItterator();
}
/**
 * @author lzlj21@163.com
 *
 *定义arralist存储菜单的菜单类
 */
public class PancakeHouseMenu implements Menu {

    ArrayList menuItms;  //使用一个arraylist存储菜单项



    /**
     * 初始化菜单是添加菜单项
     */
    public PancakeHouseMenu() {
        menuItms= new ArrayList<>();
        /**
         * 简化菜单内容
         */
        additem("name1","description1",true,2.99);
        additem("name2","description2",true,3.99);
        additem("name3","description3",true,4.99);
        additem("name4","description4",true,5.99);
        additem("name5","description5",true,6.99);
        additem("name6","description6",true,7.99);
        additem("name7","description7",true,8.99);
    }



    /** 
     * 添加菜单项
     * 
     * @param name  
     * @param description
     * @param vegetarian
     * @param price
     */
    private void additem(String name, String description, boolean vegetarian, double price) {
        MenuItem item =new MenuItem(name, description, vegetarian, price);
        menuItms.add(item);

    }



    /* 
     * 调用菜单项arraylist的iterator方法
     */
    @Override
    public Iterator createItterator() {
        return menuItms.iterator();
    }

}
/**
 * @author lzlj21@163.com
 *
 *餐厅菜单迭代器类
 */
public class DinerMenuIterator implements Iterator<Menu> {

    MenuItem[] items;
    int position;  // 记录当前数组遍历 的位置



    /**
     * @param items  传入一个菜单项的数组当做参数
     */
    public DinerMenuIterator(MenuItem[] items) {
        this.items = items;
    }

    /* 
     * 检查我们是否已经取得数组内所以的元素,如果还有元素待遍历,则返回true。
     */
    @Override
    public boolean hasNext() {
        /*
         * 因为是使用固定长度的数组,所以我们不但要检查是否超出了数组长度,
         * 也必须检查是否下一项是null,如果是null,就表示没有其他项了。
         */
        if (position<=items.length||items[position]==null) {
            return false;
        }else{
            return true;
        }
    }

    @Override
    public Menu next() {
        // TODO Auto-generated method stub
        return null;
    }

}
/**
 * @author lzlj21@163.com
 *
 *定义arralist存储菜单的菜单类
 */
public class DinerMenu implements Menu {

    static final int MAX_ITEMS=6; // 控制菜单长度
    int numberOfItems=0;  //菜单计数器
    MenuItem [] menuItems;  //菜单存储在数组中


    /**
     * 初始化菜单是添加菜单项
     */
    public DinerMenu() {
        menuItems= new  MenuItem[MAX_ITEMS];
        /**
         * 简化菜单内容
         */
        additem("name1","description1",true,2.99);
        additem("name2","description2",true,3.99);
        additem("name3","description3",true,4.99);
        additem("name4","description4",true,5.99);
        additem("name5","description5",true,6.99);
        additem("name6","description6",true,7.99);
        additem("name7","description7",true,8.99);
    }



    /** 
     * 添加菜单项
     * 
     * @param name  
     * @param description
     * @param vegetarian
     * @param price
     */
    private void additem(String name, String description, boolean vegetarian, double price) {
        MenuItem item =new MenuItem(name, description, vegetarian, price);
        //监测是否超出菜单长度
        if (numberOfItems >=MAX_ITEMS) {
            System.out.println("sorry,nenu is full!  can't add item to menu");
        } else {
            menuItems[numberOfItems]=item;
            numberOfItems++;
        }

    }



    /* 
     * 调用菜单项arraylist的iterator方法
     */
    @Override
    public Iterator createItterator() {
        return new DinerMenuIterator(menuItems);
    }

}
/**
 * @author lzlj21@163.com
 *
 *定义一个女招待类
 *打印菜单
 */
public class Waitress {

    Menu pancakeHouseMenu;
    Menu dinnerMenu;

    //将菜单项的接口传入,和女招待类解耦合
    public Waitress(Menu pancakeHouseMenu, Menu dinnerMenu) {
        this.pancakeHouseMenu = pancakeHouseMenu;
        this.dinnerMenu = dinnerMenu;
    }

    /**
     * 打印菜单
     */
    public void printMenu(){
        Iterator pancakeIteator = pancakeHouseMenu.createItterator();
        Iterator dinneIterator = dinnerMenu.createItterator();
        System.out.println("Menu\n-----\n BREAKFAST");
        priintMenu(pancakeIteator);
        System.out.println("\n LUNCH");
        priintMenu(dinneIterator);

    }

    /**
     * 循环打印菜单项
     * @param iteator
     */
    private void priintMenu(Iterator iteator) {
        while (iteator.hasNext()) {
            MenuItem menuItem = (MenuItem) iteator.next();
            System.out.println(menuItem.getName()+", ");
            System.out.println(menuItem.getPrice()+" --  ");
            System.out.println(menuItem.getDescription());

        }

    }


}
public class MenuTestDrive {

    public static void main(String[] args) {
        PancakeHouseMenu pancakeHouseMenu=new PancakeHouseMenu();
        DinerMenu dinerMenu =new DinerMenu();
        //传入菜单
        Waitress waitress=new Waitress(pancakeHouseMenu, dinerMenu);
        //打印菜单
        waitress.printMenu();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值