图解设计模式(一)-Iterator

文章介绍了Java中使用Iterator模式来遍历集合的例子,如BookShelf类存储Book对象,并通过实现Aggregate接口创建Iterator。BookShelfIterator作为具体迭代器,实现了hasNext和next方法。Iterator模式使得集合的遍历方式独立于集合本身,增强了代码的灵活性。
摘要由CSDN通过智能技术生成

迭代器---Iterator

示例代码:将书(Book)放置到书架(BookShelf),并将书的名字按顺序显示。

Aggravate接口 :

目的:遍历的集合的接口。实现该接口的类可以保存多个元素,就像数组.

/**
 * iterator接口是用于遍历集合的迭代器
 * 想要遍历集合的元素可以调用iterator方法来生成一个实现iterator接口的实例
 */
public interface Aggregate {
    public abstract Iterator iterator();
}

Iterator接口 :

/**
 * 用于遍历集合中元素,类似循环变量
 * 实现方法:1.hasNext 判断是否有下一元素
 * 2.next方法 实际实现了两个功能 1)返回集合中的元素Object形式  2)迭代器移动到下一元素
 * 具体的实现则需要通过实现了该接口的类 才知道next实际干的活
 */
public interface Iterator {
    public abstract boolean hasNext();

    public abstract Object next();
}

Book类:

@Data
public class Book {

    private String name;

    public Book(String name){
        this.name = name;
    }
}

BookShelf类:

@Data
public class BookShelf implements Aggregate{

    private Book[] books;

    private int last = 0 ;

    public BookShelf(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 getLength(){
        return last;
    }

    @Override
    public Iterator iterator() {
        return new BookShelfIterator(this);
    }
}

注意这里实现了Iterator接口

BookShelfIterator类:

/**
 * 该类需要发挥Iterator作用,因此实现了该类
 * bookShelf为该类所要遍历的书架,index指当前迭代器的指向的书的下标
 * index初始化=0
 * 是否有下一本通过bookShelf.length()来比较
 * next返回书是谁,并且让index指向下一本书
 */
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 true;
        }else {
            return false;
        }
    }

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

Iterator模式中登场的角色:

Iterator(迭代器):

该角色负责定义按顺序逐个遍历元素的接口(API)。

ConcreteIterator(具体的迭代器):

该角色负责实现Iterator角色所定义的接口(API), 即BookShelfIterator类。包含遍历集合所必须的信息。

Aggregate(集合):

该角色负责创建Iterator角色的接口(API)。这个接口(API)是一个方法,回创建出“按顺序访问保存在我内部元素的人”。在示例程序中,由Aggregate接口扮演这个角色,它定义了Iterator方法。

ConcreteAggreate(具体的集合):

该角色负责实现Aggregate角色所定义的接口(API)。创建出具体的Iterator角色,即ConcreteIterator角色。示例中 BookShelf扮演该角色,实现了Interator方法。

 使用Iterator的目的:

        不管BookShelf如何变化,只要BookShelf的Iterator方法能正确返回实例,hasNext和next方法都能正常使用,不对while改变,仍然能用。

        这能协助理解为什么在程序中Iterator方法的返回不是BookShelfIterator类,而是Iterator类,就是需要使用Iterator的方法进行变成,而不是BookShelfIterator的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值