找回密码
 立即注册
首页 业界区 业界 Iterator模式

Iterator模式

勺缓曜 2025-6-6 08:55:58
Part1 ITerator模式

作用:循环不依赖具体的集合实现,扩展性比较好。
1.1 Iterator模式

使用Java语言显示数据arr中的元素时,我们可以使用下面的for循环语句遍历数组。
  1. for (int i = 0; i < arr.length; i++) {
  2.     System.out.println("i = " + i);
  3.   }
复制代码
将此处i的作用抽象化、通化后形成的模式,在设计模式中称为Iterator模式
Iterator模式用于在数据集合中按照顺序遍历集合。英语中Iterator意味反复做某事,汉语中称之为“迭代器”。
1.2 示例程序

来看一段实现了Iterator模式的示例程序。这段示例程序的作用是将书(Book)放到书架(Bookshelf)中,并将书的名字按顺序显示出来。
1.png

Iterator模式重点概念:
名称说明角色Aggregate 接口表示集合的接口集合Iterator 接口遍历集合的接口迭代器Book 类表示 书的类BookShelf 类表示书架类具体的集合BookShelfIterator 类表示遍历书架的类具体的迭代器类图说明
2.png

代码清单1-1 Aggregate接口
  1. public interface Aggregate {
  2.         public abstract Iterator iterator();
  3. }
复制代码
在Aggregate接口中声明的方法只有一个——iterator()方法。该方法会生成一个用于遍历集合的迭代器。
想要遍历集合中的元素时,调用Aggregate#iterator() 方法来生成一个实现了Iterator接口的 类的实例。
代码清单1-2 Iterator接口
  1. public interface Iterator {
  2.     Boolean hasNext();
  3.     Object next();
  4. }
复制代码
hasNext()是否还存在元素,用来控制是否需要进行下次遍历。
next()方法,获取当前下标位置的对象,并移动下标位置。
代码清单1-3 Book类
  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class Book {
  5.     String name;
  6. }
复制代码
Book实体类
代码清单1-4 BookShelf
  1. @Data
  2. public class BookShelf implements Aggregate{
  3.     Book[] books;
  4.     Integer last = 0;
  5.     public BookShelf(Integer maxSize) {
  6.         this.books = new Book[maxSize];
  7.     }
  8.     public Book getIndexAt(Integer index){
  9.         return books[index];
  10.     }
  11.     public void appendBook(Book book){
  12.         this.books[last] = book;
  13.         last++;
  14.     }
  15.     public Integer getLength(){
  16.         return last;
  17.     }
  18.     @Override
  19.     public Iterator iterator() {
  20.         return new BookShelfIterator(this);
  21.     }
  22. }
复制代码
书架实体类。 需要将此类作为集合处理,所以需要继承集合类Aggregate,实现获取迭代器方法iterator();
代码清单1-5 BookShelfIterator
  1. public class BookShelfIterator implements Iterator {
  2.     private BookShelf bookShelf;
  3.     private int index;
  4.    
  5.     public BookShelfIterator(BookShelf bookShelf) {
  6.         this.bookShelf = bookShelf;
  7.         this.index = 0;
  8.     }
  9.     @Override
  10.     public Boolean hasNext() {
  11.         if (index < bookShelf.getLength()) {
  12.             return Boolean.TRUE;
  13.         }else {
  14.             return Boolean.FALSE;
  15.         }
  16.     }
  17.     @Override
  18.     public Object next() {
  19.         Book book = bookShelf.getIndexAt(index);
  20.         index++;
  21.         return book;
  22.     }
  23. }
复制代码
用于遍历书架的类,需要有遍历功能因此继承了Iterator接口。

  • 初始化时,bookShelf 属性表明需要遍历的书架;index 属性表明下表的位置,初始化为0。
  • hasNext()方法需要返回是否还有下一个元素要处理,True代表有,False代表没有。使用index和getLength()总册数的对比来判断。
  • next() 方法获取当前下标位置的对象用做返回,并且移动下标到下个位置。
    代码清单1-5 main函数
  1. public class Main {
  2.     public static void main(String[] args) {
  3.         BookShelf bookShelf = new BookShelf(4);
  4.         bookShelf.appendBook(new Book("《西游记》"));
  5.         bookShelf.appendBook(new Book("《红楼梦》"));
  6.         bookShelf.appendBook(new Book("《三国演义》"));
  7.         bookShelf.appendBook(new Book("《水浒传》"));
  8.         Iterator it = bookShelf.iterator();
  9.         while(it.hasNext()){
  10.             Book next = (Book)it.next();
  11.             System.out.println("next = " + next);
  12.         }
  13.     }
  14. }
复制代码
main函数可以看出,整个while循环只调用了hasNext()和next()方法,并不依赖BookShelf具体的集合对象。如果集合对象发生变化,不影响这部分代码。扩展性比较好。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册