设计模式【Iterator 模式】

Iterator 模式

1.什么是 Iterator 模式

Iterator 模式就是按照顺序遍历数据集合。

2.示例程序

1.Aggregate 接口

Aggregate 接口是要遍历的集合的接口,声明方法 iterator ,实现了该接口的类可以通过 iterator 方法遍历数据集合的元素。

java 复制代码
public interface Aggregate {
    // 返回值是Iterator,体现和集合类的实现无关性,只返回迭代器类迭代到的数据
    public abstract Iterator iterator();
}

2.Iterator 接口

Iterator 接口用于遍历集合中的元素。

这里先提供两个方法 hasNext 和 next 。

java 复制代码
public interface Iterator {
    public abstract boolean hasNext();
    // 这里的next方法是要有返回值的
    public abstract Object next();
}

3.BookShelf 类(实现 Aggregate)

BookShelf 是一个集合,实现了 Aggregate 接口。可以被 BookShelfIterator 遍历。

java 复制代码
public class BookShelf implements Aggregate{
    // 本类是Book类的集合,使用ArrayList存储Book对象,便于书架中进行添加书等操作
    private ArrayList<Book> books;

    // 构造方法,初始化集合对象
    public BookShelf() {
        this.books = new ArrayList<Book>();
    }
    
    // iterator方法,用来遍历本集合
    public Iterator iterator() {
        // BookShelfIterator会返回迭代的结果
        return new BookShelfIterator(this);
    }
    
    // 添加书本
    public void addBook(Book book) {
        books.add(book);
    }
    // 根据索引查找书本
    public Book getBook(int index) {
        return books.get(index);
    }
    // 返回书本数量
    public int getLength() {
        return books.size();
    }
}

4.Book 类(BookShelf 的属性)

表示书的类,是 BookShelf 类这个集合的元素。

java 复制代码
public class Book {
    private String name;
    public Book(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

5.BookShelfIterator 类(实现 Iterator)

用于遍历 BookShelf 的迭代器,实现了 Iterator ,作用是将 BookShelf 的实现和遍历分离。

java 复制代码
public class BookShelfIterator implements Iterator{
    // 本类对BookShelf进行遍历,添加BookShelf对象
    private BookShelf bookShelf;
    // 要根据索引对bookShelf进行操作
    private int index;
    
    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.index = 0;
    }
    
    // 可以理解为是否还能遍历,即调用next()
    public boolean hasNext() {
        // 索引等于长度的时候就超出去了
        if (index < bookShelf.getLength()) {
            return true;
        } else {
            return false;
        }
    }
    public Object next() {
        Book book = bookShelf.getBook(index);
        index++;
        return book;
    }
}

6.Main

程序测试类。

java 复制代码
public class Main {
    public static void main(String[] args) {
        BookShelf bookShelf = new BookShelf();
        bookShelf.addBook(new Book("地球往事"));
        bookShelf.addBook(new Book("黑暗森林"));
        bookShelf.addBook(new Book("死神永生"));
        bookShelf.addBook(new Book("流浪地球"));
        // 创建迭代器
        Iterator it = new BookShelfIterator(bookShelf);
        // 迭代
        while (it.hasNext()) {
            Book book = (Book)it.next();
            System.out.println(book.getName());
        }
    }
}


//程序执行结果:
/*地球往事
黑暗森林
死神永生
流浪地球*/

3.思考

1.类图

2.Iterator

1.Iterator 的实现类可以有多个,可以设计多种遍历方式,至于使用哪种方式,就要看集合实现类中调用 iterator 方法时 new 的是哪一个迭代器。

*2.Iterator 可以将集合实现类的实现和遍历分离开来,当使用诸如 while 循环来遍历集合时,不需要依赖集合的实现,只需要使用迭代器类的方法如 hasNext() 和 next(),这也是为什么要使用 Iterator 模式。

3.集合类和迭代器类的关系

集合的实现类和迭代器的实现类是有对应关系的,一但集合类的某些API发生变化,是需要修改迭代器类的。

如果对您有帮助,请点赞关注支持我,谢谢!❤

如有错误或者不足之处,敬请指正!❤

个人主页:星不易

设计模式专栏:不易|设计模式

相关推荐
编啊编程啊程2 小时前
JUC之AQS
java·开发语言·jvm·c++·kafka
孟婆来包棒棒糖~2 小时前
Maven快速入门
java·spring boot·spring·maven·intellij-idea
jingfeng5145 小时前
C++模板进阶
java·c++·算法
杨杨杨大侠5 小时前
附录 1:[特殊字符] Maven Central 发布完整指南:从零到成功部署
java·spring boot·maven
ahauedu5 小时前
AI资深 Java 研发专家系统解析Java 中常见的 Queue实现类
java·开发语言·中间件
小厂永远得不到的男人6 小时前
基于 Spring Validation 实现全局参数校验异常处理
java·后端·架构
计算机编程小咖6 小时前
《基于大数据的农产品交易数据分析与可视化系统》选题不当,毕业答辩可能直接挂科
java·大数据·hadoop·python·数据挖掘·数据分析·spark
艾莉丝努力练剑6 小时前
【C语言16天强化训练】从基础入门到进阶:Day 7
java·c语言·学习·算法
老华带你飞6 小时前
校园交友|基于SprinBoot+vue的校园交友网站(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·校园交友网站