设计模式之迭代器与组合模式(二)

在上次的文章中,咱们经过层层引导,已经知道了迭代器模式的由来。如今咱们再好好总结下。java

关于迭代器模式,你所须要知道的第一件事情,就是它依赖于一个名为迭代器的接口。这是一个可能的迭代器的接口:数组

如今,咱们一旦有了这个接口,就能够为各类对象集合实现迭代器:数组、列表、散列表...若是我么想要为数组实现迭代器,以便使用在DinerMenu中,看起来就像这样:学习

在餐厅菜单中加入一个迭代器

想要在餐厅菜单中加入一个迭代器,咱们须要先定义迭代器接口:this

public interface Iterator {
    boolean hasNext();
    Object next();
}

如今咱们须要实现一个具体的迭代器,为餐厅菜单服务:设计

public class DinerMenuIterator implements Iterator {
    MenuItem[] items;
    int position = 0;
 
    public DinerMenuIterator(MenuItem[] items) {
        this.items = items;
    }
 
    public MenuItem next() {
        MenuItem menuItem = items[position];
        position = position + 1;
        return menuItem;
    }
 
    public boolean hasNext() {
        if (position >= items.length || items[position] == null) {
            return false;
        } else {
            return true;
        }
    }
}

接下来,咱们改写下餐厅菜单:3d

public Iterator createIterator() {
    return new DinerMenuIterator(menuItems);
    // To test Alternating menu items, comment out above line,
    // and uncomment the line below.
    //return new AlternatingDinerMenuIterator(menuItems);
}

咱们须要将迭代器代码整合进服务员中。咱们应该摆脱本来冗余的部分。整合的作法至关直接:首先建立一个printMenu()方法,传入一个迭代器当作此方法的参数,而后对每个菜单都是用createIterator()方法来检索迭代器,并将迭代器传入新方法。code

public class Waitress {
    Menu pancakeHouseMenu;
    Menu dinerMenu;
 
    public Waitress(Menu pancakeHouseMenu, Menu dinerMenu) {
        this.pancakeHouseMenu = pancakeHouseMenu;
        this.dinerMenu = dinerMenu;
    }
 
    public void printMenu() {
        Iterator pancakeIterator = pancakeHouseMenu.createIterator();
        Iterator dinerIterator = dinerMenu.createIterator();

        System.out.println("MENU\n----\nBREAKFAST");
        printMenu(pancakeIterator);
        System.out.println("\nLUNCH");
        printMenu(dinerIterator);

    }
 
    private void printMenu(Iterator iterator) {
        while (iterator.hasNext()) {
            MenuItem menuItem = iterator.next();
            System.out.print(menuItem.getName() + ", ");
            System.out.print(menuItem.getPrice() + " -- ");
            System.out.println(menuItem.getDescription());
        }
    }
    // 此处省略其余方法
}

熟悉Java的同窗应该知道,其实Java有自带的迭代器接口。可是,我在这里为何不这么作呢,是为了让咱们更好地了解如何从头建立一个迭代器。如今目的达到了,因此就要改变作法,把以前自定义的迭代器改为Java的Iterator接口便可,在这里就不进行具体描述啦,详情请看源码便可。对象

定义迭代器模式

如今咱们已经知道了如何用本身的迭代器来实现迭代器模式,也看到了Java是如何在某些面向聚合的类中(入ArrayList)支持迭代器的。如今咱们就来看看这个模式真的正式定义:blog

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内容的表示。接口

这个模式给你提供了一种方法,能够顺序访问一个汇集对象中的元素,而又不用知道内部是如何表示的。在设计中使用迭代器的影响是明显的:若是你有一个统一的方法访问聚合中的每个对象,你就能够编写多态的代码和这些聚合搭配,使用--如同前面的printMenu()方法同样,只要有了迭代器这个方法根本无论菜单项到底是有由数组仍是ArrayList来保存的。

另外一个对你设计形成重要影响的,是迭代器模式把元素之间游走的责任交给迭代器,而不是聚合对象。这不只让聚合的接口和实现变得更简洁,也可让聚合更专一在它所应该专一的事情上面,而没必要去理会遍历的事情。

让咱们检查类图,未来龙去脉拼凑出来

至此,迭代器模式咱们就差很少都了解啦。可是,接下来,咱们还会介绍组合模式,它为何要和迭代器模式放在同一个章节里面呢?咱们下回分晓。

爱生活,爱学习,爱感悟,爱挨踢

相关文章
相关标签/搜索