定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。
类型:行为类模式
类图:
,,,,,,如果要问Java中使用最多的一种模式,答案不是单例模式,也不是工厂模式,更不是策略模式,而是迭代器模式,先来看一段代码吧:
公共静态空白打印(收集coll) { 它=coll.iterator Iterator (); 而(it.hasNext ()) { 字符串str=(字符串)it.next (); System.out.println (str); } }
,,,,,,,这个方法的作用是循环打印一个字符串集合,里面就用到了迭代器模式,爪哇语言已经完整地实现了迭代器模式,迭代器翻译成汉语就是迭代器的意思。提到迭代器,首先它是与集合相关的,集合也叫聚集,容器等,我们可以将集合看成是一个可以包容对象的容器,例如列表,设置,地图,甚至数组都可以叫做集合,而迭代器的作用就是把容器中的对象一个一个地遍历出来只
& # 61623;抽象容器:一般是一个接口,提供一个iterator()方法,例如java中收集的接口,列表接口,套接口等。
& # 61623;具体容器:就是抽象容器的具体实现类,比如列表接口的有序列表实现ArrayList,列表接口的链表实现LinkList,套接口的哈希列表的实现HashSet等。
& # 61623;抽象迭代器:定义遍历元素所需要的方法,一般来说会有这么三个方法:取得第一个元素的方法第(),取得下一个元素的方法下(),判断是否遍历结束的方法结束()(或者叫hasNext()),移出当前对象的方法删除(),
& # 61623;迭代器实现:实现迭代器接口中定义的方法,完成集合的迭代只
代码实现
界面迭代器{ 公共对象next (); 公共布尔hasNext (); } 类ConcreteIterator实现迭代器{ 私人列表列表=new ArrayList (); 私人int光标=0; 公共ConcreteIterator列表(列表){ 这一点。列表=; } 公共布尔hasNext () { 如果光标==list.size ()) { 返回错误; } 返回true; } 公共对象next () { 对象obj=零; 如果(this.hasNext ()) { 光标obj=this.list.get (+ +); } 返回obj; } } 界面聚合{ 公共空间添加(对象obj); 公共空间删除(对象obj); 公共迭代器Iterator (); } 类ConcreteAggregate实现总{ 私人列表列表=new ArrayList (); 公共空间添加(对象obj) { list.add (obj); } 公共迭代器Iterator () { 返回新ConcreteIterator(列表); } 公共空间删除(对象obj) { list.remove (obj); } } 公共类客户{ 公共静态void main (String [] args) { 总ag)=new ConcreteAggregate (); ag.add(“小明”); ag.add(“小红”); ag.add(“小刚”); 它=ag.iterator Iterator (); 而(it.hasNext ()) { 字符串str=(字符串)it.next (); System.out.println (str); } } }
,,,,,,上面的代码中,聚合是容器类接口,大家可以想象一下收集、列表、设置等,总就是他们的简化版,容器类接口中主要有三个方法:添加对象方法添加、删除对象方法删除取得迭代器方法iterator.Iterator是迭代器接口,主要有两个方法:取得迭代对象方法,判断是否迭代完成方法hasNext,大家可以对比并不知道和java.util.Iterator两个接口自行思考只
,,,,,,,<强>迭代器模式的优点有:强>
-
<李> & # 61623;简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于哈希表来说,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。李>
<李> & # 61623;可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。李>
<李> & # 61623;封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。李>
,,,,,,,<强>迭代器模式的缺点:强>