迭代器模式

迭代器模式

在Java中想显示数组中的元素时,我们可以使用下面这种for方法,我们先看下下面这个示例:

public class IteratorPattern {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }
}

这段代码很简单,代码中循环变量 i 的初始值是 0 ,然后会递增为 1 2 3 4 5,程序会在每次 i 递增后都输出 array[i],这是经常会使用到的 for 循环语句

假如将这里的循环变量 i 的作用抽象化、递用化后形成的模式,在设计模式中称为迭代模式

迭代模式示例

首先,看下下面这段代码,实现了迭代模式的示例,这段示例程序的作用是将书(Book)放到书架(BookSelf)中,并将书名的名字按顺序显示出来

Aggregate.java

interface Aggregate{
    abstract Iterator iterator();
}

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

Iterator.java

interface Iterator{
    abstract boolean hashNext();
    abstract Object next();
}

这里我们声明了两个方法,即判断是否存在下一个元素的hashNext方法和获取下一个元素的方法

  • hashNext方法返回的是boolean类型的
  • next返回的是一个Object类型,这表明该方法返回的是集合中的一个元素。为了能够在下次调用next方法时正确地返回下一个元素,该方法中还隐含着将迭代器移动到下一个元素的处理

Book.java类(表示书名)

class Book{

    private String bookName;   //书名
    
    public Book(String bookName){
        this.bookName = bookName;
    }
    
    public String getBookName(){
        return bookName;
    }
}

BookSelf.java(表示书架类)

该类实现了Aggregate接口的iterator方法

class BookSelf implements Aggregate{

    private Book[] books;    //定义books字段

    private int last = 0;

    public BookSelf(int maxSize){
        this.books = new Book[maxSize];
    }

    public Book getBookAt(int index){
        return books[index];
    }

    public void appendBook(Book book){
        this.books[last] = book;
        last++;
    }

    public int getBookLength(){
        return last;
    }

    public Iterator iterator(){
        return new BookSelfIterator(this);
    }
}

这个BookSelf 类中定义了books字段,它是Book类型的数组。该数组的大小(maxSize)在生成BookSelf的实例时就被指定了。之所以将books字段的可见性设置为private,是为了防止外部不小心改变了该字段的值

BookSelfIterator.java类

class BookSelfIterator implements Iterator{

    private BookSelf bookSelf;

    private int index;

    public BookSelfIterator(BookSelf bookSelf){
        this.bookSelf = bookSelf;
        this.index = 0;
    }

    @Override
    public boolean hashNext() {
        if (index < bookSelf.getBookLength()){
            return true;
        }else{
            return false;
        }
    }

    @Override
    public Object next() {
        Book book = bookSelf.getBookAt(index);
        index++;
        return book;
    }
}

关注我的公众号,一起学习
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值