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

·  阅读 257

1.介绍

一个一个遍历 在这里插入图片描述

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

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

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

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

案例场景

  • 遍历书架上的书 在这里插入图片描述

类和接口一览表

在这里插入图片描述

名字说明
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 模式的类图 在这里插入图片描述

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改