返回

《设计模式 - Iterator 迭代器模式》从入门到精通

前端

概述:迭代器模式

在软件设计中,迭代器模式是一种行为型模式,提供一种方法来访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。该模式旨在解决聚合的种类繁多、遍历方式各不相同的问题,从而提供一种统一的访问方式。

核心思想:

  • 将聚合对象的遍历方式从聚合对象本身分离出来,单独设计一个迭代器对象来负责元素的遍历。
  • 将迭代器对象设计成一个独立的类,负责封装聚合对象的内部表示,并提供一组方法来访问聚合对象中的元素。

结构图:

[Aggregate]-->(hasNext, next)-->[Iterator]-->(current)-->[Element]

优点:

  • 降低耦合度:将聚合对象的遍历方式从聚合对象本身分离出来,使聚合对象和迭代器对象之间解耦。
  • 提高代码复用性:迭代器模式可以将遍历方式封装成一个独立的类,从而可以很容易地被其他对象重用。
  • 提高代码的可扩展性:迭代器模式可以很容易地添加新的遍历方式,而无需修改聚合对象本身。
  • 提高代码的可读性:迭代器模式可以使代码更加清晰易懂,因为遍历方式与聚合对象本身的代码是分离的。

应用场景:

  • 当需要遍历一个聚合对象中的元素时,但又不希望暴露该对象的内部表示时。
  • 当需要在不同的场景中以不同的方式遍历一个聚合对象中的元素时。
  • 当需要将遍历方式封装成一个独立的类时。
  • 当需要提高代码的可读性时。

代码范例:

// 聚合类
public class Aggregate {
    private List<Integer> list = new ArrayList<>();

    public void add(int i) {
        list.add(i);
    }

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

// 迭代器类
public interface Iterator {
    boolean hasNext();

    int next();
}

// 具体迭代器类
public class ConcreteIterator implements Iterator {
    private Aggregate aggregate;
    private int index = 0;

    public ConcreteIterator(Aggregate aggregate) {
        this.aggregate = aggregate;
    }

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

    @Override
    public int next() {
        return aggregate.list.get(index++);
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        Aggregate aggregate = new Aggregate();
        aggregate.add(1);
        aggregate.add(2);
        aggregate.add(3);

        Iterator iterator = aggregate.getIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

结束语:

通过精读《设计模式 - Iterator 迭代器模式》,您将深入理解该模式的结构、实现、适用场景以及实际编程范例。作为面向对象设计的重要一环,迭代器模式可以有效降低耦合度、提高代码复用性、可扩展性和可读性。掌握迭代器模式,将使您在软件设计中游刃有余,轻松应对各种复杂场景。