Iterator模式

科技资讯 投稿 5900 0 评论

Iterator模式

Part1 ITerator模式

1.1 Iterator模式

使用Java语言显示数据arr中的元素时,我们可以使用下面的for循环语句遍历数组。

for (int i = 0; i < arr.length; i++ {
    System.out.println("i = " + i;
  }

将此处i的作用抽象化、通化后形成的模式,在设计模式中称为Iterator模式
Iterator模式用于在数据集合中按照顺序遍历集合。英语中Iterator意味反复做某事,汉语中称之为“迭代器”。

1.2 示例程序

Iterator模式重点概念:

名称 说明 角色
Aggregate 接口 表示集合的接口 集合
Iterator 接口 遍历集合的接口 迭代器
Book 类 表示 书的类
BookShelf 类 表示书架类 具体的集合
BookShelfIterator 类 表示遍历书架的类 具体的迭代器

类图说明

代码清单1-1 Aggregate接口

public interface Aggregate {
	public abstract Iterator iterator(;
}

在Aggregate接口中声明的方法只有一个——iterator(方法。该方法会生成一个用于遍历集合的迭代器。
想要遍历集合中的元素时,调用Aggregate#iterator( 方法来生成一个实现了Iterator接口的 类的实例。
代码清单1-2 Iterator接口

public interface Iterator {
    Boolean hasNext(;
    Object next(;
}

hasNext(是否还存在元素,用来控制是否需要进行下次遍历。
next(方法,获取当前下标位置的对象,并移动下标位置。
代码清单1-3 Book类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {
    String name;
}

Book实体类
代码清单1-4 BookShelf

@Data
public class BookShelf implements Aggregate{
    Book[] books;
    Integer last = 0;
    public BookShelf(Integer maxSize {
        this.books = new Book[maxSize];
    }
    public Book getIndexAt(Integer index{
        return books[index];
    }
    public void appendBook(Book book{
        this.books[last] = book;
        last++;
    }

    public Integer getLength({
        return last;
    }
    @Override
    public Iterator iterator( {
        return new BookShelfIterator(this;
    }
}

书架实体类。 需要将此类作为集合处理,所以需要继承集合类Aggregate,实现获取迭代器方法iterator(;
代码清单1-5 BookShelfIterator

public class BookShelfIterator implements Iterator {
    private BookShelf bookShelf;
    private int index;
    
    public BookShelfIterator(BookShelf bookShelf {
        this.bookShelf = bookShelf;
        this.index = 0;
    }
    @Override
    public Boolean hasNext( {
        if (index < bookShelf.getLength( {
            return Boolean.TRUE;
        }else {
            return Boolean.FALSE;
        }
    }
    @Override
    public Object next( {
        Book book = bookShelf.getIndexAt(index;
        index++;
        return book;
    }
}

用于遍历书架的类,需要有遍历功能因此继承了Iterator接口。

    初始化时,bookShelf 属性表明需要遍历的书架;index 属性表明下表的位置,初始化为0。
  1. hasNext(方法需要返回是否还有下一个元素要处理,True代表有,False代表没有。使用index和getLength(总册数的对比来判断。
  2. next( 方法获取当前下标位置的对象用做返回,并且移动下标到下个位置。
    代码清单1-5 main函数
public class Main {
    public static void main(String[] args {
        BookShelf bookShelf = new BookShelf(4;
        bookShelf.appendBook(new Book("《西游记》";
        bookShelf.appendBook(new Book("《红楼梦》";
        bookShelf.appendBook(new Book("《三国演义》";
        bookShelf.appendBook(new Book("《水浒传》";

        Iterator it = bookShelf.iterator(;
        while(it.hasNext({
            Book next = (Bookit.next(;
            System.out.println("next = " + next;
        }
    }
}

main函数可以看出,整个while循环只调用了hasNext(和next(方法,并不依赖BookShelf具体的集合对象。如果集合对象发生变化,不影响这部分代码。扩展性比较好。

编程笔记 » Iterator模式

赞同 (34) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽