设计模式-迭代器模式

迭代器模式

角色

  • 抽象迭代器(Iterator)

定义了访问和遍历元素的接口,声明了用于遍历数据元素的方法。

  • 具体迭代器(ConcreteIterator)

它实现了抽象迭代器接口,完成对聚合对象的遍历。

  • 抽象聚合类(Aggregate)

用于存储和管理元素对象,声明一个CreateIterator()方法用于创建一个迭代器对象,充当抽象迭代器工厂角色。

  • 具体聚合类(ConcreteAggregate)

实现了在抽象聚合类中声明的CreateIterator()方法,返回一个对应的具体迭代器ConcreteIterator实例。

案例

遍历书架

Book: 聚合类元素

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

    @Override
    public String toString() {
        return "Book{" +
            "name='" + name + '\'' +
            '}';
    }
}

Iterator: 抽象迭代器

public interface Iterator {
    public boolean hasNext();
    public Object next();
}

BookShelf: 聚合类(抽象层直接用了List)

import java.util.ArrayList;
import java.util.List;

public class BookShelf{
    private List<Book> books;

    public BookShelf(){
        this.books = new ArrayList<>();
    }

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

    public int getLength(){
        return this.books.size();
    }

    public Book getBook(int index){
        return this.books.get(index);
    }

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

BookShelfIterator: 书架迭代器

public class BookShelfIterator implements Iterator{
    private BookShelf bookShelf;
    private int index = 0;

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

    @Override
    public boolean hasNext() {
        return index < bookShelf.getLength();
    }

    @Override
    public Object next() {
        return bookShelf.getBook(index++);
    }
}

Main:

public class Main {
    public static void main(String[] args) {
        BookShelf bookShelf = new BookShelf();
        bookShelf.addBook(new Book("书本1"));
        bookShelf.addBook(new Book("书本2"));
        bookShelf.addBook(new Book("书本3"));
        Iterator iter = bookShelf.getIterator();
        while (iter.hasNext()){
            System.out.println(iter.next().toString());
        }
    }
}

Output:

Book{name='书本1'}
Book{name='书本2'}
Book{name='书本3'}

应用场景

  • 访问一个聚合对象的内容而无须暴露它的内部表示。
  • 需要为一个聚合对象提供多种遍历方式。

你可能感兴趣的:(设计模式,设计模式,迭代器模式,java,笔记)