美文网首页
迭代器模式(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