2021年11月27日18:24:29
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. ——《Design Patterns: Elements of Reusable Object-Oriented Software》
提供一种顺序访问集合的元素而不暴露其底层表示的方法。 ——《设计模式:可复用面向对象软件的基础》
迭代器模式是一种行为型模式。
迭代器模式就是提供一种遍历的方法,这种方法有两个特点:一是按你想要的方式访问到你想访问的元素,二是不暴露底层是什么存的,怎么存的。
在开发过程中,我们使用类库提供给我们的集合,遍历集合中的元素,使用的就是迭代器。一般情况下,单单作为使用者,我们是不会去关注这些集合底层结构是什么,只需要拿到我们需要的数据,进行业务逻辑的处理就可以了。但是呢,作为一个优秀的开发者,当然要深入了解各种集合的数据结构及操作的。当然啦,我们是不会说我们是为了面试才去了解的啦。(此处应该有表情)
常见用法:
List<String> list = new ArrayList<>(); list.add("ming"); list.add("ming"); list.add("come"); for(String s : list) { System.out.println(s); }
上面代码中的for循环遍历列表中的数据,Java编译器会将这段代码变成使用ArrayList中的迭代器去遍历数据。编译之后再反编译,代码如下:
List<String> list = new ArrayList(); list.add("ming"); list.add("ming"); list.add("come"); Iterator var1 = list.iterator(); while(var1.hasNext()) { String s = (String)var1.next(); System.out.println(s); }
迭代器模式结构图:
抽象迭代器角色(Iterator):
具体迭代器角色(ConcreteIterator):
抽象集合角色(Aggregate):
具体集合角色(ConcreteAggregate):
家有小女,名为晓月,一岁有余,嘤嘤学语。
除夕佳节,给家人拜年,爷爷奶奶,爸爸妈妈,叔叔婶婶,还有晓月自己,新年快乐。
类图:
public interface NameIterator { String next(); boolean hastNext(); }
public interface FamilyAggregate { NameIterator createIterator(); boolean addFamily(int generation, String name); }
// 具体集合类 public class FamilyAggregateImpl implements FamilyAggregate { private int generation; private List<String>[] generations; public FamilyAggregateImpl(int generation) { this.generation = generation; this.generations = initFamily(generation); } private List<String>[] initFamily(int generation) { List<String>[] name = new ArrayList[generation]; for (int i = 0; i < generation; i++) { name[i] = new ArrayList<>(); } return name; } public boolean addFamily(int generation, String name) { return generations[generation - 1].add(name); } @Override public NameIterator createIterator() { return new NameIteratorImpl(); } // 具体迭代器 private class NameIteratorImpl implements NameIterator { int currentGeneration; int cursor; NameIteratorImpl() { this.currentGeneration = FamilyAggregateImpl.this.generation; } @Override public String next() { int i = cursor; List<String>[] generations = FamilyAggregateImpl.this.generations; if (currentGeneration == 1 && cursor == generations.length) { System.out.println("无剩余可遍历"); } String name = generations[currentGeneration - 1].get(i); cursor = i + 1; if (cursor == generations[currentGeneration - 1].size()) { currentGeneration--; cursor = 0; } return name; } @Override public boolean hastNext() { return currentGeneration != 0; } } }
public class Client { public static void main(String[] args) { FamilyAggregate family = new FamilyAggregateImpl(3); family.addFamily(1, "晓月"); family.addFamily(2, "爸爸"); family.addFamily(2, "妈妈"); family.addFamily(2, "叔叔"); family.addFamily(2, "婶婶"); family.addFamily(3, "爷爷"); family.addFamily(3, "奶奶 "); NameIterator iterator = family.createIterator(); while (iterator.hastNext()) { String name = iterator.next(); System.out.println(name); } } }
结果如下:
爷爷 奶奶 爸爸 妈妈 叔叔 婶婶 晓月
迭代器模式应该是最常见的设计模式了,可以说Java程序员只要开发,都要使用它。
迭代器模式是一种行为型设计模式,它为集合提供了一个遍历元素的方式,又不会暴露它的内部表示。
2021年12月7日01:47:38