【地铁上的设计模式】--行为型模式:迭代器模式

2023-05-09 17:52:43 浏览数 (1)

什么是迭代器模式

迭代器模式是一种行为型设计模式,它提供了一种遍历聚合对象中各个元素的方法,而不需要暴露该聚合对象的内部表示。这个模式分离了聚合对象的遍历行为,使得遍历算法能够与聚合对象分离开来,从而可以在不改变聚合对象的情况下定义新的遍历操作。迭代器模式由迭代器接口、具体迭代器类、聚合接口和具体聚合类等组成,其中迭代器接口定义了访问和遍历元素的方法,而聚合接口定义了创建迭代器的方法。迭代器模式的实现可以大大简化遍历聚合对象中元素的代码,同时也可以方便地新增不同类型的迭代器,从而为聚合对象提供不同的遍历行为。

如何实现迭代器模式

迭代器模式的实现步骤如下:

  1. 定义抽象迭代器接口(Iterator),其中包含 hasNext() 和 next() 方法,分别用于判断是否还有下一个元素和获取下一个元素。
  2. 定义抽象聚合接口(Aggregate),其中包含 createIterator() 方法,用于创建对应的迭代器。
  3. 实现具体的聚合类(ConcreteAggregate),实现聚合接口,并实现 createIterator() 方法,返回对应的具体迭代器实例。
  4. 实现具体的迭代器类(ConcreteIterator),实现迭代器接口,实现 hasNext() 和 next() 方法,用于遍历聚合对象中的元素。
  5. 在客户端代码中,通过调用聚合类的 createIterator() 方法获取迭代器实例,并使用迭代器的 hasNext() 和 next() 方法遍历聚合对象中的元素。

迭代器模式的核心思想是将聚合对象与迭代器对象分离,使得聚合对象的内部结构和元素遍历算法可以独立变化,从而提高了代码的灵活性和可维护性。

Java实现 以下是 Java 实现迭代器模式的示例代码:

代码语言:javascript复制
import java.util.ArrayList;
import java.util.Iterator;

public class Main {
  public static void main(String[] args) {
    ArrayList<String> names = new ArrayList<String>();
    names.add("Alice");
    names.add("Bob");
    names.add("Charlie");

    Iterator<String> it = names.iterator();
    while (it.hasNext()) {
      String name = it.next();
      System.out.println(name);
    }
  }
}

在这个示例中,我们使用 ArrayList 存储了一些字符串,然后通过调用 iterator() 方法获取到了一个迭代器 it,并使用 while 循环和 hasNext()next() 方法来遍历所有元素并打印它们的值。

Tip:Java 标准库已经提供了迭代器接口 Iterator,所以在实现迭代器模式时可以直接使用标准库提供的接口。如果需要自定义迭代器,只需要实现 Iterator 接口即可。

C#实现 以下是C#实现迭代器模式的示例代码:

代码语言:javascript复制
using System;
using System.Collections;

// 抽象聚合类
abstract class Aggregate {
    public abstract Iterator CreateIterator();
}

// 具体聚合类
class ConcreteAggregate : Aggregate {
    private ArrayList items = new ArrayList();

    public override Iterator CreateIterator() {
        return new ConcreteIterator(this);
    }

    public int Count {
        get { return items.Count; }
    }

    public object this[int index] {
        get { return items[index]; }
        set { items.Insert(index, value); }
    }
}

// 抽象迭代器类
abstract class Iterator {
    public abstract object First();
    public abstract object Next();
    public abstract bool IsDone();
    public abstract object CurrentItem();
}

// 具体迭代器类
class ConcreteIterator : Iterator {
    private ConcreteAggregate aggregate;
    private int current = 0;

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

    public override object First() {
        return aggregate[0];
    }

    public override object Next() {
        object ret = null;
        if (current < aggregate.Count - 1) {
            ret = aggregate[  current];
        }
        return ret;
    }

    public override bool IsDone() {
        return current >= aggregate.Count;
    }

    public override object CurrentItem() {
        return aggregate[current];
    }
}

// 客户端
class Client {
    static void Main(string[] args) {
        ConcreteAggregate a = new ConcreteAggregate();
        a[0] = "item1";
        a[1] = "item2";
        a[2] = "item3";
        a[3] = "item4";

        Iterator i = a.CreateIterator();
        for (object item = i.First(); !i.IsDone(); item = i.Next()) {
            Console.WriteLine(item);
        }

        Console.ReadLine();
    }
}

其中,Aggregate为抽象聚合类,提供了创建迭代器的抽象方法CreateIterator()ConcreteAggregate为具体聚合类,继承了Aggregate,实现了CreateIterator()方法,同时还包含了一个用于存储聚合元素的ArrayListIterator为抽象迭代器类,提供了获取第一个元素、获取下一个元素、判断是否迭代完成和获取当前元素等抽象方法;ConcreteIterator为具体迭代器类,继承了Iterator,实现了其中的抽象方法,同时持有一个对聚合对象的引用,以便进行迭代操作;Client为客户端类,实例化ConcreteAggregate对象并调用其CreateIterator()方法创建迭代器,然后通过迭代器对聚合对象进行遍历操作。

总结

迭代器模式是一种行为设计模式,它提供了一种简单的方式来访问集合对象中的元素,而不需要暴露集合内部的表示细节。迭代器模式将集合的遍历行为抽象成一个迭代器接口,使得客户端代码可以通过迭代器遍历集合元素。 优点:迭代器模式可以隐藏集合内部的实现细节,从而使得客户端代码可以使用同样的方式遍历不同类型的集合,而不需要关心集合的具体实现。此外,迭代器模式可以简化集合类的接口,减少了集合类与客户端代码之间的耦合度。 缺点:由于迭代器模式会增加额外的类和接口,因此会增加代码的复杂性。此外,迭代器模式可能会降低程序的性能,因为每次访问元素都需要调用迭代器接口。

总体来说,迭代器模式适用于需要遍历集合对象中元素的场景,它可以提高代码的灵活性和可复用性。

0 人点赞