迭代器模式
一. 说明
迭代器模式主要用于迭代访问集合对象中的元素,而不用知道元素内部的结构状态。迭代器模式是属于行为型模式的一种。
迭代器模式在编程语言中使用较多,它的优点是可以用相同的方式,遍历不同的数据结构集合。在java中有许多集合都已经实现了这种模式,类似List, Set, Map等实现了Iterator接口的集合类,通过Iterator接口遍历的方式都是一样的,我们通过while-true在遍历集合时,通过Iterator.hasNext()判断是否存在下一个元素,通过Iterator.next()获取下一个元素。
二.应用场景
- 遍历集合的场景,集合可以是各种数据结构构成的
- 为不同的集合遍历提供相同的遍历方式时可以使用
三.代码示例
我们以通讯录为例,实现java的Iterator接口来让通讯录具有遍历功能
先创建一个集合接口,它继承自Iterator接口,具有添加、删除名片和获取迭代器的功能
public interface Collection<T> extends Iterator<T> {
Iterator<T> getIterator();
boolean add(T t);
boolean remove(T t);
}
再创建一个名片实体类, 和通讯录集,通讯录集就是集合的实现类
@Data
public class NameCard {
private String name;
private int age;
private String job;
private String company;
private String mobile;
}
public class AddressBook implements Collection<NameCard> {
private NameCard[] cards = null;
private int index;
@Override
public Iterator<NameCard> getIterator() {
index = 0;
return this;
}
@Override
public boolean add(NameCard nameCard) {
if (cards == null) {
cards = new NameCard[]{nameCard};
} else {
NameCard[] temp = new NameCard[cards.length + 1];
System.arraycopy(cards, 0, temp, 0, cards.length);
temp[temp.length - 1] = nameCard;
cards = temp;
}
return true;
}
@Override
public boolean remove(NameCard nameCard) {
NameCard[] temp = new NameCard[cards.length - 1];
int j = 0;
for (int i = 0; i < cards.length; i++) {
if (cards[i] != nameCard) {
temp[j] = cards[i];
j++;
}
}
cards = temp;
return true;
}
@Override
public boolean hasNext() {
return index < cards.length;
}
@Override
public NameCard next() {
if (hasNext()) {
return cards[index++];
}
return null;
}
}
编写测试代码
public static void main(String[] args) {
NameCard card1 = new NameCard();
card1.setName("张三");
card1.setAge(20);
card1.setJob("销售");
card1.setCompany("A公司");
card1.setMobile("00000001");
NameCard card2 = new NameCard();
card2.setName("李四");
card2.setAge(22);
card2.setJob("行政");
card2.setCompany("B公司");
card2.setMobile("111111111");
NameCard card3 = new NameCard();
card3.setName("王五");
card3.setAge(25);
card3.setJob("后勤");
card3.setCompany("C公司");
card3.setMobile("22222222");
AddressBook addressBook = new AddressBook();
addressBook.add(card1);
addressBook.add(card2);
addressBook.add(card3);
Iterator<NameCard> iterator = addressBook.getIterator();
while (iterator.hasNext()) {
NameCard card = iterator.next();
System.out.println(card);
}
System.out.println("------------------------");
addressBook.remove(card2);
Iterator<NameCard> iterator1 = addressBook.getIterator();
while (iterator1.hasNext()) {
NameCard card = iterator1.next();
System.out.println(card);
}
}
结果输出如下
我们利用Java实现的迭代器模式的Iterator接口,实现了像List一样的遍历功能,但这个案例中没有考虑List集合中的一些优化点,诸如数组扩容等。
四. 总结
迭代器模式满足了单一职责和开放封闭原则,外界调用无需关心不同数据结构在使用上的差异,它们的使用方式都是一致的。