迭代器和组合模式

来源:互联网 发布:网络兼职被骗怎么办 编辑:程序博客网 时间:2024/06/11 00:56

迭代器模式

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

代码

/** * 菜单类 * 定义 菜单名称、描述、是否为素食和价格 * */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();    }}
原创粉丝点击