欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式之迭代器模式(Iterator)

程序员文章站 2021-12-12 11:37:42
Iterator用于在数据集合中按照顺序遍历集合。英文单词Iterate有反复做某件事情的意思...

1.介绍

一个一个遍历
设计模式之迭代器模式(Iterator)

  • 定义:
    提供一种方法,顺序访问一个集合对象中的各个元素,而不暴露该对象的内部表示

  • 适用场景:
    访问一个集合对象的内容而无需暴露它的内部表示
    为遍历不同的集合结构提供一个统一的接口

  • 优点:
    分离集合对象的遍历行为

  • 缺点:
    类的个数成对增加

案例场景

  • 遍历书架上的书
    设计模式之迭代器模式(Iterator)

类和接口一览表

设计模式之迭代器模式(Iterator)

名字 说明
Aggregate 表示集合的接口
Iterator 遍历集合的接口
Book 表示书中的类
BookShelf 表示书架的类
BookShelfIterator 遍历书籍的类
Main 测试程序的入口

Aggregate

只有一个iterator接口,生成一个用于遍历集合的迭代器

public interface Aggregate {
    Iterator iterator();
}

Iterator接口

声明两个方法,hasNext():用于判断是否存在下一个元素,next():获取下一个元素

public interface Iterator<T> {
    boolean hasNext();
    T next();
}

Book类

书的实体对象,getName 获取书名

public class Book {

    private String name;

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

    public String getName() {
        return name;
    }
}

BookShelf类

表示书架的类,由于该类作为集合进行处理,因此实现Aggregate接口

public class BookShelf implements Aggregate {
    private List<Book> books = new ArrayList<Book>();

    public Integer length() {
        return books.size();
    }

    public Book get(Integer index) {
        return books.get(index);
    }

    public void add(Book book) {
        books.add(book);
    }


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

BookShelfIterator类

用于遍历书架上书的类

public class BookShelfIterator implements Iterator<Book> {
    private BookShelf bookShelf;
    private Integer index;


    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.index = 0;
    }

    public boolean hasNext() {
        return index < bookShelf.length();
    }

    public Book next() {
        return bookShelf.get(index++);
    }
}

Main入口

public class Main {
    public static void main(String[] args) {
        BookShelf bookShelf =new BookShelf();
        bookShelf.add(new Book("Java"));
        bookShelf.add(new Book("C++"));
        bookShelf.add(new Book("PHP"));
        bookShelf.add(new Book("数据结构"));
        bookShelf.add(new Book("线性代数"));

        Iterator iterator = bookShelf.iterator();
        while (iterator.hasNext()){
            Book next = (Book) iterator.next();
            System.out.println(next.getName());
        }
    }
}

Iterator模式中各角色的作用

Iterator(迭代器)

该角色责任定义按顺序逐个遍历元素的接口。
程序中,由Iterator接口扮演,定义了hasNext和next两个方法。

Concretelterator(具体的迭代器)

该角色负责实现Iterator角色所定义的接口.该角色包含了遍历集合所必须的信息

Aggregate(集合)

该角色负责定义创建Iterator角色的接口。这个接口是一个方法会创建出一个,按照顺序访问保存在内部元素的信息

ConcreteAggregate(具体集合)

该角色负责实现Aggregate角色所定义的接口。他会创建出具体的Iterator角色,也就是ConcreteIterator,也就是实例中的BookShelf
Iterator 模式的类图
设计模式之迭代器模式(Iterator)

本文地址:https://blog.csdn.net/cen50958/article/details/112254012

相关标签: 设计模式