Java学设计模式之迭代器模式

一、迭代器模式概念

1.1 什么是迭代器模式

迭代器模式是一种行为型设计模式,它提供了一种方法来顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。简单来说,迭代器模式可以让你遍历一个集合对象,而无需了解其内部结构。

结构

  1. 迭代器(Iterator): 定义了访问和遍历元素的接口。

  2. 具体迭代器(Concrete Iterator): 实现了迭代器接口,并对聚合对象进行具体的遍历。

  3. 聚合对象(Aggregate): 定义了创建相应迭代器的接口。

  4. 具体聚合对象(Concrete Aggregate): 实现了创建相应迭代器的方法,返回一个适用于该聚合对象的具体迭代器。

二、迭代器模式代码

2.1 迭代器接口

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

2.2 具体迭代器

public class ListIterator<T> implements Iterator<T> {
    private List<T> list;
    private int position = 0;

    public ListIterator(List<T> list) {
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        return position < list.size();
    }

    @Override
    public T next() {
        if (!hasNext()) {
            throw new NoSuchElementException();
        }
        return list.get(position++);
    }
}

2.3 聚合对象接口

public interface List<T> {
    Iterator<T> iterator();

    void add(T item);

    T get(int index);

    int size();
}

2.4 具体聚合对象

public class ArrayList<T> implements List<T> {
    private java.util.List<T> list = new java.util.ArrayList<>();

    @Override
    public Iterator<T> iterator() {
        return new ListIterator<>(list);
    }

    @Override
    public void add(T item) {
        list.add(item);
    }

    @Override
    public T get(int index) {
        return list.get(index);
    }

    @Override
    public int size() {
        return list.size();
    }
}

2.5 测试类

public class IteratorPatternTest {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");

        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
        // 输出:
        // Apple
        // Banana
        // Orange
    }
}

三、总结

迭代器模式提供了一种简单而统一的方式来访问一个聚合对象中的各个元素,而不需要了解其内部实现。这种模式可以增加代码的灵活性和可维护性,并且让客户端代码与集合对象的具体实现解耦。

posted @ 2024-05-10 15:24  Kllin  阅读(42)  评论(0编辑  收藏  举报