设计模式-迭代器模式(Iterator Pattern)

本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/

迭代器模式简介

迭代器相信大部分人都不陌生,java/c++等很多编程语言的容器类都支持迭代器操作,这个模式就是介绍迭代器实现的细节。

迭代器模式的定义和基本结构

定义:提供一个可以顺序访问一个聚合对象中的各个元素有不暴露器内部实现的方法。

一张来自《Head First》的结构图。

client:调用Iterator对ConcreteAggregate内的元素进行迭代而不需要关系ConcreteAggregate的具体结构。

ConcreteAggregate:某种聚合类的代表,如ArrayList之类。

ConcreteIterator:与某种聚合类关联的迭代器类,实现了Iterator接口,每一种具体的聚合类类型都会有一个对应的ConcreteIterator。

Iterator:这个接口包含了迭代器的一般方法。

Aggregate:包含createIterator()方法,继承了这个接口就表示这个聚合类支持迭代器,调用createIterator()方法就可以获得这个迭代器。

一个简单的实例(java)

不用什么例子了,我们就实现一个针对ArrayList的迭代器当练习就好。

我们先写一个新的类把ArrayList包装一下,就叫MyArrayList,然后实现一个针对MyArrayList的迭代器。

MyArrayList将继承一个Iterable接口,这个接口是java提供的,实现这个接口表示这个聚合类支持迭代器,和上面结构中的Aggregate作用一样,只不过Iterable里的方法叫做iterator()。代码如下。

 1 import java.util.ArrayList;
 2 import java.util.Iterator;
 3 public class MyArrayList implements Iterable<String> {
 4     ArrayList<String> arrayList;
 5     int position=0;
 6     public MyArrayList(){
 7         arrayList=new ArrayList<String>();
 8     }
 9     public void addItem(String s){
10         arrayList.add(s);
11     }
12     public void removeItem(int index){
13         arrayList.remove(index);
14     }
15     public int size(){
16         return arrayList.size();
17     }
18     public String getItem(int index){
19         return arrayList.get(index);
20     }
21     @Override
22     public Iterator<String> iterator() {
23         return new MyArrayListIterator(this);
24     }
25 }

之后实现MyArrayListIterator类,也就是结构图中的ConcreteIterator类,他将继承java提供的Iterator接口,里面有hasNext(),next(),remove()三个方法需要实现,我们实现前两个就可以完成迭代,第三个先直接抛出一个异常把,大家也可以自己实现,反正很简单。

 1 import java.util.Iterator;
 2 public class MyArrayListIterator implements Iterator<String> {
 3     MyArrayList myArrayList;
 4     int position=0;
 5     public MyArrayListIterator(MyArrayList m){
 6         myArrayList=m;
 7     }
 8     @Override
 9     public boolean hasNext() {
10         if(myArrayList.size()>position)
11             return true;
12         return false;
13     }
14     @Override
15     public String next() {
16         return myArrayList.getItem(position++);
17     }
18     @Override
19     public void remove() {
20         throw new UnsupportedOperationException();
21     }
22 }

测试代码如下。

 1 import java.util.Iterator;
 2 public class Test {
 3     public static void main(String[] args) {
 4         MyArrayList m=new MyArrayList();
 5         m.addItem("first");
 6         m.addItem("second");
 7         m.addItem("tired");
 8         m.addItem("fourth");
 9         m.addItem("fifth");
10         Iterator<String> it= m.iterator();
11         while(it.hasNext()){
12             System.out.println(it.next());
13         }
14     }
15 }

输出如下:

关于for/in语句(Java 5)

在java 5之后,java 给出了一种新的for语句让我们迭代聚合类,只要是支持Iterator的聚合类都可以用这种语句来迭代,简例如下

 1 import java.util.Iterator;
 2 public class Test {
 3     public static void main(String[] args) {
 4         MyArrayList m=new MyArrayList();
 5         m.addItem("first");
 6         m.addItem("second");
 7         m.addItem("tired");
 8         m.addItem("fourth");
 9         m.addItem("fifth");
10         Iterator<String> it= m.iterator();
11 //        while(it.hasNext()){
12 //            System.out.println(it.next());
13 //        }
14         for(String s:m){
15             System.out.println(s);
16         }
17     }
18 }

输出和上面并没有区别。

迭代器模式到此结束,这个模式对程序员来说简直是太熟悉了,超级简单对不对?(^∇^*)。

参考资料:《Head First 设计模式》。

时间: 2024-10-04 05:15:48

设计模式-迭代器模式(Iterator Pattern)的相关文章

设计模式 - 迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解

迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式(iterator pattern): http://blog.csdn.net/caroline_wendy/article/details/35254643 Java的标准库(util)中包含迭代器接口(iterator interface), import java.util.Iterator; 继承(

设计模式 - 迭代器模式(iterator pattern) 详解

迭代器模式(iterator pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一种方法顺序访问一个聚合对象中的各个元素, 而又不暴露其内部的表示; 建立迭代器接口(iterator interface), 包含hasNext()方法和next()方法; 不同聚合对象的具体的迭代器(concrete iterator), 继承(implements)迭代器接口(iterator in

设计模式 - 迭代器模式(iterator pattern) 扩展 详解

迭代器模式(iterator pattern) 扩展 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式-Java迭代器: http://blog.csdn.net/caroline_wendy/article/details/35268931 扩展迭代器模式, 添加一个Hashtable存储的类. 具体方法: 1. Hashtable的类, 包含创建value()的迭代器(iterator). /** * @time 2014年6月27日

设计模式 - 迭代器模式(iterator pattern) 具体解释

迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一种方法顺序訪问一个聚合对象中的各个元素, 而又不暴露其内部的表示; 建立迭代器接口(iterator interface), 包括hasNext()方法和next()方法; 不同聚合对象的详细的迭代器(concrete iterator), 继承(implements)迭代器接口(iterator

[设计模式] 迭代器模式 Iterator Pattern

在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角色组成: 1.迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口.2.具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置.3.集合角色(Aggregate):集合角色负责提供创建具体迭代器角色的接口.4.具体集合角色(Concre

设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释

迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(iterator pattern): http://blog.csdn.net/caroline_wendy/article/details/35254643 Java的标准库(util)中包括迭代器接口(iterator interface), import java.util.Iterator; 继承

二十四种设计模式:迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现在要提供一种方法顺序地访问这个聚合对象中的各个元素. MessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Iterator { /// <summary>

设计模式(行为型)之迭代器模式(Iterator Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之观察者模式(Observer Pattern)>http://blog.csdn.net/yanbober/article/details/45484749 概述 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构

16.迭代器模式(Iterator Pattern)

using System; namespace ConsoleApplication9 { class Program { /// <summary> /// 迭代器模式提供了一种方法顺序访问一个聚合对象(理解为集合对象)中各个元素, /// 而又无需暴露该对象的内部表示,这样既可以做到不暴露集合的内部结构, /// 又可让外部代码透明地访问集合内部的数据. /// </summary> /// <param name="args"></par

用最简单的例子理解迭代器模式(Iterator Pattern)

迭代器模式的需求来自:需要对一些集合进行迭代,而迭代的方式可能有很多种. 说到迭代,动作大致包括设置第一个位置,获取下一个位置元素,判断是否迭代结束,获取当前位置元素,大致就这么些.把这些迭代动作封装到一个接口中. public interface IIterator { void First(); string Next(); bool IsDone(); string Current(); } 在现实场景中,迭代的方式可能有很多种,先实现一种迭代方式,实现IIterator接口. publi