设计模式学习三、迭代器模式

一、什么是迭代器模式

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

二、使用场景

         通用的方法遍历集合元素

三、模式构成

              迭代器角色:定义遍历元素所需要的方法
              具体迭代器角色:实现迭代器接口的方法

              聚集类:Aggregate(抽象类)和ConcreteAggregate(具体聚集类)表示聚集类,是用来存储迭代器的数据。

              在Aggregate(抽象类)中有一个CreateIterator方法,用来获取迭代器


四、举个例子

            例子:jone与tony分别管理一家餐厅,两家餐厅宣布共同经营。jone负责早餐,tony负责午餐。两家只有一个服务员。 但是两家的菜单有所区别,jone的菜单用数组管理,tony用的是数组。这个服务员如何打印菜单更加方便。

            分析:如果使用传统的方式,服务员打印菜单的时候,会先用一个for循环打印jone数组的菜单,然后用另一个循环打印tony链表的菜单,而且这两者输出内容的代码基本相同(造成代码冗余)。这时候,就可以使用迭代器,用一种通用的方式,既可以打印jone的菜单,又可以打印tony的菜单 。 

      代码:

 

//抽象迭代器
interface Iterator {
    public boolean hasNext();

    public Object next();
}
//具体迭代器
class ArrayIterator implements  Iterator{

    private  Object []items;
    private int index=0;
    private int max;
    public ArrayIterator(Object[] items,int max) {
        this.items = items;
        this.max=max;
    }

    @Override
    public boolean hasNext() {
        if (items.length!=0&&index<items.length&&index<max){
            return true;
        }else{
            return false;
        }
    }

    @Override
    public Object next() {
        return items[index++];
    }
}
class ArrayListIterator implements  Iterator{

    private List list=new ArrayList();
    private int pos=0;
    public ArrayListIterator(List list) {
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        if (list.size()>0&&pos<list.size()){
            return true;
        }
        return false;
    }

    @Override
    public Object next() {
        return list.get(pos++);
    }
}
interface  Menu{//抽象聚集类
    public void add(Object obj);
    public Iterator createIterator();//通过此方法获取迭代器
}
//具体聚集类
class JoneBreakfastMenu implements Menu{

    //具体的存储器,直接使用java的list
    private List list=new ArrayList();

    @Override
    public void add(Object obj) {
        list.add(obj);
    }

    @Override
    public Iterator createIterator() {
        return new ArrayListIterator(list);
    }
}
//具体聚集类
class TonyDinnerMenu implements  Menu{

    private String[] items=new String[10];
    private int pos;
    @Override
    public void add(Object obj) {
        if (pos<10)
        items[pos++]= (String) obj;
        else{
            System.err.println("菜单不能再多了");
        }
    }

    @Override
    public Iterator createIterator() {
        return new ArrayIterator(items,pos);
    }
}
class Waiter{
    private  TonyDinnerMenu dinnerMenu=new TonyDinnerMenu();
    private  JoneBreakfastMenu breakfastMenu=new JoneBreakfastMenu();
    public void addBreakfast(String value){
        breakfastMenu.add(value);
    }
    public void addDinner(String value){
        dinnerMenu.add(value);
    }
    //通过一个iterator(就可以遍历数组与List)
    private void print(Iterator iterator){
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
    public void print(){
        System.out.println("早餐");
        print(breakfastMenu.createIterator());
        System.out.println("晚餐");
        print(dinnerMenu.createIterator());
    }
}
public class Iterator1 {
    public static  void main(String args[]){
        Waiter waiter=new Waiter();
        waiter.addBreakfast("鸡蛋");
        waiter.addBreakfast("牛奶");
        waiter.addBreakfast("面包");
        waiter.addDinner("苦瓜炒鸡蛋~~");
        waiter.print();

    }
}


五、补充

 

            java中,对于迭代器有自己的实现,像是list,set,map,collection都有实现好的迭代器。如果想要自己的集合使用迭代器,可以实现java中的Iterator接口。所以,我们不需要手工写一个Iterator接口


ps:渣渣菜鸟一个,如有不对,请指正~~~

      

   

 

posted @ 2017-11-03 11:59  十禾。  阅读(118)  评论(0)    收藏  举报