设计模式之迭代器和组合模式

迭代器模式

1、简介:迭代器模式提供一种方法访问一个聚合对象中的各个元素,而有保证不暴露其内部实现方式。
(1)它让我们能够游走在各种聚合类型数据的每一个元素之间,而有无需让大家知道游走的什么类型的聚合,反正都能够达到循环输出元素的目的。(2)它能够把游走的任务搬到迭代器上,而不再使用各种适合自己聚合类型的forEach来游走遍历元素。使得聚合和迭代器的任务各得其所。
这种模式能够解决,在一个系统中,存在不同存储数据的聚合类型的整合。想要简化代码,游走遍历每种聚合的每一个元素,就需要使用迭代器来简化。让对应的聚合类型集成迭代器Iterator,就能够使用hasNext()和next()方法。这样的简化使得聚合对象只负责存储数据,而由迭代器来遍历游走元素。
2.这里付一段简单的代码。

//定义一个迭代器接口
public interface Iterator{
    boolean hasNext();
    Object next();
}
//午餐迭代器实现迭代器接口
public class DinerMenuIterator implents Iterator(){
    MenuItem[] items;
    int position = 0;

    public DinerMenuIterator (MenuItem items){
        this.items = items;
    }
    public Object hasNext(){
        MenuItem menuItem = items[position]
        position = position + 1;
        return menuItem;
    }

    public boolean hasNext(){
        if(position > items.length || items.position == null){
            return false;
        }else{
            return true;
        }       
    }
}
//餐厅午餐菜单
public class  DinnerMenu{
    static final int MAX_ITEMS = 6;
    int numberOfItems = 0;
    MenuItem[] menuItems;

    public Iterator createIterator(){
        return new DinerMenuIterator(menuItems);
    }
}

//这里省略以ArrayList存储形式的集合定义,名称定义为CoffeeIterator。同上的Iterator。

//女招待员对每个菜单的操作,无需知道其如何实现,直接使用Iterator对集合进行操作
public class Waitreess{
    DinerMenu dinerMenu ;
    CoffeeMenu coffeeMenu;

    public waitress(DinerMenu dinerMenu,CoffeeMenu coffeeMenu){
        this.dinerMenu= dinerMenu;
        this.coffeeMenu= coffeeMenu;
    }

    public void printMenu(){
        Iterator dinerMenuIterator  = dinerMenu.createIterator();
        Iterator coffeeIterator = coffeeMenu.createIterator();
        printMenu(dinerMenuIterator);
        printMenu(coffeeIterator);
    }
    public void printMenu(Iterator iterator){
        while (iterator.hasNext()){
            MenuItem menuItem = (MenuItem)iterator.next();
        }
    }
}

3、代码集成优化之后,发现这种方式和一种模式很像—-由子类来决定创建什么—–【工厂方法模式】。
这里叫做“迭代器和组合模式”。


后面有一部分关于迭代器的深入讲解,lue


4、“单一责任原则”:一个类应该只有一个引起变化的原因。

猜你喜欢

转载自blog.csdn.net/amethyst128/article/details/78561901