迭代器模式
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"};@Overridepublic Iterator getIterator() {return new MyIterator();}private class MyIterator implements Iterator{// 当前访问的对象下标int current = 0;@Overridepublic Object next() {if (this.hasNext()) {return demo[current++];}return null;}@Overridepublic 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
完成!!!