美文网首页
迭代器模式(Iterator)(常用)

迭代器模式(Iterator)(常用)

作者: jiahzhon | 来源:发表于2020-01-11 11:37 被阅读0次
    • 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
    • 迭代器模式让我们能游走于聚合内的每一个元素,而又不暴露其内部的表示。
    • 把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让责任各得其所。
    • 该模式依赖于Iterator接口
    • 将元素的遍历和实现分离开来

    - 主要角色

    • 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
    • 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。
    • 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。
    • 具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。

    - 结构图

    diedai.gif
    public class ChineseBook {
          private String name;
      
          public ChineseBook(String name) {
              this.name = name;
          }
      
         public String getName() {
             return name;
         }
     }
    
    public interface Aggregate {
           public abstract Iterator iterator();
     }
    
     public class ChineseBookShelf implements Aggregate {
           private ChineseBook[] books;
           int pointer=0;
           public ChineseBookShelf(int max_size){
             books=new ChineseBook[max_size];
           }
           public void appendChineseBook(ChineseBook book){
             books[pointer]=book;
             pointer++;
           }
           public ChineseBook findChineseBookAt(int index){
              return books[index];
           }
           public int getLength(){
                return pointer;
           }
           public Iterator iterator(){
              return new ChineseBookShelfIterator(this);
           }
     }
    

    关键点

     public interface Iterator {
       public abstract boolean hasNext();
       public abstract Object  next();
     }
    
     public class ChineseBookShelfIterator implements Iterator {
      
         ChineseBookShelf bookShelf;
         int index;
         public ChineseBookShelfIterator(ChineseBookShelf bookShelf){
             this.bookShelf=bookShelf;
             index=0;
         }
         public boolean hasNext() {
             if(index<this.bookShelf.getLength()){
                 return true;
             }
             return false;
         }
     
         public Object next() {
             return bookShelf.findChineseBookAt(index++);
         }
     }
    
     public class Main {
     
         public static void main(String[] args) {
             
             ChineseBook book1 = new ChineseBook("朝花夕拾");
             ChineseBook book2 = new ChineseBook("围城");
             ChineseBook book3 = new ChineseBook("遮天");
             ChineseBook book4 = new ChineseBook("寻秦记");
             ChineseBook book5 = new ChineseBook("骆驼祥子");
     
             ChineseBookShelf bookShelf = new ChineseBookShelf(5);
     
             bookShelf.appendBook(book1);
             bookShelf.appendBook(book2);
             bookShelf.appendBook(book3);
             bookShelf.appendBook(book4);
             bookShelf.appendBook(book5);
             
             Iterator it= bookShelf.iterator();
             while(it.hasNext()){
                 ChineseBook book=(ChineseBook)it.next();
                 System.out.println("书的名字为《"+book.getName()+"》");
             }
         }
     }
    

    如果这个时候有另外一个书架,但是他的实现方式是arrayList与上面的数组不同,那个就可以编写这个新书架的Iterator。如果要实现拿出两个书架的书,就可以创建相应的迭代器,简化获取书时的代码,也无需知道每个书架是怎么实现循环输出的。

    相关文章

      网友评论

          本文标题:迭代器模式(Iterator)(常用)

          本文链接:https://www.haomeiwen.com/subject/pquvactx.html