迭代器模式
Iterator Pattern:迭代器模式,是GoF23种设计模式中属于行为型模式的一种。
迭代器的模式已经是很多高级编程语言中常用的设计模式了,体现的位置也是方方面面都可以,比如最常用的for循环就是如此。
在JAVA中,有增强for循环,使用到的就是迭代器模式
for(Demo demo : demos){
// TODO
}
在Python中,有着for in 的循环语句也是迭代器模式的体现
for demo in demos:
pass
在.NET中,有着IEumerator支持对非泛型集合的简单迭代接口。
结构
结合类图简单分析一下,迭代器对象分为四个角色,也可以说其实只有两个角色:
- 聚合对象:也就是被迭代的对象,这是一个抽象类,用于程序的后序扩展
- 迭代器对象:这是迭代器抽象类或者接口,定义如何得到聚合对象的第一个对象,如何得到下一个对象,如何判断是否已经到达结尾等等统一的行为抽象方法。
- 具体聚合对象:也就是实现了聚合对象的实体类
- 具体的迭代器:实现迭代器,并且对指定的具体聚合对象做定制化的操作。
举例
- Java语言中有着iterator就是迭代器模式的体现。
- 多个语言中的for循环也有迭代器的体现。
注意
- 迭代器模式可以按照一个顺序访问聚合对象中的各个元素,而且不需要向用户展示聚合对象的具体实现细节。
- 迭代器模式可以提供多个不同的方向访问聚合对象中的各个元素,给遍历元素带来多样化的遍历方式。也就是说,一个聚合对象上面可以有多个不同的遍历方式。
一个小DEMO
-
场景
迭代器模式说简单点就是提供一个访问的顺序的方式,而且不需要了解对象的内部细节,每个对象的访问都是统一的操作。
-
迭代器接口
/** * 迭代器模式——迭代器抽象类/接口 * @author wq */ public interface Iterator { // 得到下一个对象 Object next(); // 判断是否到达结尾,也就是还有没有下一个 boolean hasNext(); }
-
聚合对象抽象
/** * 迭代器模式——聚合对象抽象类/接口 * @author wq */ public interface Aggregate { // 得到迭代器 Iterator getIterator(); }
-
常见的内部类实现迭代器的方式,这里以数组为例子,也可以是List,Set,Map都行
/** * 迭代器模式——具体的聚合对象 具体的迭代器对象 * 通过内部类的方式实现,也是常见的实现方式 * @author wq */ public class MyAggregate implements Aggregate{ public String[] demo = {"a","b","c","d","e"}; @Override public Iterator getIterator() { return new MyIterator(); } private class MyIterator implements Iterator{ // 当前访问的对象下标 int current = 0; @Override public Object next() { if (this.hasNext()) { return demo[current++]; } return null; } @Override public boolean hasNext() { return current < demo.length ? true : false; } } }
-
测试类
/** * 迭代器模式——测试类 * @author wq */ public class Main { public static void main(String[] args) { MyAggregate myAggregate = new MyAggregate(); for (Iterator iterator = myAggregate.getIterator(); iterator.hasNext();) { System.out.println("-->" + iterator.next()); } } }
-
走一波
-->a -->b -->c -->d -->e
完成!!!