设计模式之迭代器模式

文章目录

    • 1. 迭代模式中,主要包含以下部分:
    • 2. **注意事项**:
    • 3. 迭代器模式实现步骤
    • 4. 案例编码
      • 4.0 有一个`Book`基础类
      • 4.2 抽象迭代器接口定义
      • 4.2 包含抽象迭代器的抽象集合
      • 4.3 具体的类集合实现抽象集合接口(Aggregate),并在其中传入`this`参数实现具体迭代器
      • 4.4 具体迭代器

设计模式之迭代器模式_第1张图片

1. 迭代模式中,主要包含以下部分:

  • Iteraor(迭代器)
    • 定义了next()hasNext()方法
  • ConcreteIterator(具体的迭代器)
    • 实现具体的迭代器接口,包含具体类的聚合
  • Aggregate(聚合)
    • 负责定义创建Iterator角色的接口
  • ConcreteAggregate(具体的集合)
    • 创建出具体的迭代器

2. 注意事项

  • 使用迭代器时,返回抽象迭代器而不是具体迭代器;这样迭代器的使用可以和具体类的实现剥离。
  • 具体迭代器应该和具体类对应修改
  • next方法的用处是“返回当前元素,并指向下一个元素”
  • 将遍历功能置于Aggregate角色之外,可以为一个类编写多个具体迭代器,可以指定多种迭代方法(比如从后往前迭代等)

相关模式:

  • Visitor模式
  • Composite模式
  • Factory Method模式

3. 迭代器模式实现步骤

  1. 先定义抽象迭代器Iterator接口
  2. 然后定义一个包含抽象迭代器的抽象集合(Aggregate)
  3. 具体的类集合实现抽象集合接口(Aggregate),并在其中传入this参数实现具体迭代器
  4. 具体迭代器利用传入的this对象实现具体的遍历(nexthasNext方法)

4. 案例编码

4.0 有一个Book基础类

public class Book {
    private String name;

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

    public String getName(){
        return name;
    }
}

4.2 抽象迭代器接口定义

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

4.2 包含抽象迭代器的抽象集合

public interface Aggregate {
    public Iterator iterator();
}

4.3 具体的类集合实现抽象集合接口(Aggregate),并在其中传入this参数实现具体迭代器

public class BookShelf {
    private Book[] books;
    private int last = 0;

    public BookShelf(int maxsize) {
        books = new Book[maxsize];
    }

    public Book getBookAt(int index) {
        return books[index];
    }

    public void appendBook(Book book) {
        this.books[last] = book;
        last += 1;
    }

    public int getLength() {
        return last;
    }

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

4.4 具体迭代器

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

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

    public boolean hasNext() {
        if (index < bookShelf.getLength()) {
            return true;
        }
        else {
            return false;
        }
    }

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

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