- 浏览: 103222 次
- 性别:
- 来自: 深圳
文章分类
最新评论
Iterator模式也叫迭代模式,是由GoF提出的23种设计模式的一种。Iterator模式是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式。
本文介绍设计模式中的迭代(Iterator)模式的概念,用法,以及实际应用中怎么样使用迭代模式进行开发。
Iterator模式指对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式。
在程序设计中,经常有这种情况,需要从大量得数据(对象)集合中一个个地取出数据加以处理。Iterator模式就是为了有效地处理按顺序进行遍历访问的一种设计模式,简单地说,Iterator模式提供一种有效的方法,可以屏蔽聚集对象集合的容器类的实现细节,而能对容器内包含的对象元素按顺序进行有效的遍历访问。
所以,Iterator模式的应用场景可以归纳为满足以下几个条件:
- 访问容器中包含的内部对象
- 按顺序访问
我们举例来说明Iterator模式到底好在哪。
比如有一个Book类,一个管理Book的容器类BookList:
我们需要按顺序遍历访问BookList包含的Book对象。
怎么实现顺序遍历方法呢?
你可能会考虑以下这些遍历方法:
方法1,由容器自己实现顺序遍历。直接在BookList里直接添加顺序遍历方法:
使用时,可能的使用方法是:
方法2,让调用者自己实现遍历。直接暴露BookList数据细节给外部,比如:
可能的使用方法为:
以上方法1与方法2都可以实现对BookList所包含的Book对象进行遍历,这样有问题呢?
确实使用上没有任何问题。
但实现方法1中,
1,容器类BookList承担了太多功能:一方面需要提供添加删除等BookList本身应有的功能;一方面还需要提供遍历访问功能。
2,往往容器在实现遍历的过程中,需要保存遍历状态,当跟元素的添加删除等功能夹杂在一起,很容易引起混乱和程序运行错误等。
在实现方法2中,
容器本身未实现任何遍历方法,把这个遍历的任务交给了调用者,这样一来,暴露了容器本身的实现细节,如果一旦容器内部的数据接口发生变化,比如由于某种原因,BookList的List bookList用Map bookList来实现,这样,所有调用方的程序不得不随着BookList的修改而修改。
Iterator模式很好地解决了以上问题。
我们先从JDK中的Collection Framework对Iterator模式的实现方法来说明Iterator模式。
Java Collections Framework - Java集合框架List,Map,Set等全面介绍之概要篇
2,容器接口:Collection接口,定义了iterator()方法,把遍历委让给Iterator的实现类。
3,容器接口Collection的实现类与迭代接口Iterator的实现类:
以上说明了Java Collection Framework里的对Iterator模式的基本实现方法。
这也是Iterator模式一种经典的实现方案。
迭代器接口Iterator:该接口必须定义实现迭代功能的最小定义方法集比如提供hasNext()和next()方法。
迭代器实现类:迭代器接口Iterator的实现类。可以根据具体情况加以实现。
容器接口:定义基本功能以及提供类似Iterator iterator()的方法。
容器实现类:容器接口的实现类。必须实现Iterator iterator()方法。
Iterator模式的类图:
[该图出自Wikipedia]
应用我们的上面介绍的例子,我们需要定义以下几个接口与类:
对容器的遍历方法例:
2,隐藏容器的实现细节。
3,为容器或其子容器提供了一个统一接口,一方面方便调用;另一方面使得调用者不必关注迭代器的实现细节。
4,可以为容器或其子容器实现不同的迭代方法或多个迭代方法。
Iterator模式的概念
Iterator模式指对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式。
在程序设计中,经常有这种情况,需要从大量得数据(对象)集合中一个个地取出数据加以处理。Iterator模式就是为了有效地处理按顺序进行遍历访问的一种设计模式,简单地说,Iterator模式提供一种有效的方法,可以屏蔽聚集对象集合的容器类的实现细节,而能对容器内包含的对象元素按顺序进行有效的遍历访问。
所以,Iterator模式的应用场景可以归纳为满足以下几个条件:
- 访问容器中包含的内部对象
- 按顺序访问
为什么需要Iterator模式
在应用Iterator模式之前,首先应该明白Iterator模式用来解决什么问题。或者说,如果不使用Iterator模式,会存在什么问题。我们举例来说明Iterator模式到底好在哪。
比如有一个Book类,一个管理Book的容器类BookList:
public class Book {
...
}
public class BookList {
//保存Book对象数据
private List bookList = new ArrayList();
//添加Book对象至BookList容器
public void addBook(Book book) {
...
}
//从BookList容器删除Book对象
public void deleteBook(Book book) {
...
}
//其他方法
...
}
...
}
public class BookList {
//保存Book对象数据
private List bookList = new ArrayList();
//添加Book对象至BookList容器
public void addBook(Book book) {
...
}
//从BookList容器删除Book对象
public void deleteBook(Book book) {
...
}
//其他方法
...
}
我们需要按顺序遍历访问BookList包含的Book对象。
怎么实现顺序遍历方法呢?
你可能会考虑以下这些遍历方法:
方法1,由容器自己实现顺序遍历。直接在BookList里直接添加顺序遍历方法:
public class BookList {
private int index;
...
//得到当前Book
public Book getCurrentBook() {
...
Book book = (Book)bookList.get(index);
...
return book;
}
//是否存在下一个Book
public boolean hasNext() {
...
}
}
private int index;
...
//得到当前Book
public Book getCurrentBook() {
...
Book book = (Book)bookList.get(index);
...
return book;
}
//是否存在下一个Book
public boolean hasNext() {
...
}
}
使用时,可能的使用方法是:
BookList bookList = ...;
...
while (bookList.hasNext()) {
Book book = bookList.getCurrentBook();
//对Book加以处理(略)
...
}
...
while (bookList.hasNext()) {
Book book = bookList.getCurrentBook();
//对Book加以处理(略)
...
}
方法2,让调用者自己实现遍历。直接暴露BookList数据细节给外部,比如:
public class BookList {
...
public Book getBookList() {
...
return bookList;
}
}
...
public Book getBookList() {
...
return bookList;
}
}
可能的使用方法为:
BookList bookList = ...;
List <Book>bookDataList = bookList.getBookList();
...
for (int i=0; bookDataList != null && i<bookDataList.size(); i++) {
Book book = bookDataList.get(i);
//对Book加以处理(略)
...
}
List <Book>bookDataList = bookList.getBookList();
...
for (int i=0; bookDataList != null && i<bookDataList.size(); i++) {
Book book = bookDataList.get(i);
//对Book加以处理(略)
...
}
以上方法1与方法2都可以实现对BookList所包含的Book对象进行遍历,这样有问题呢?
确实使用上没有任何问题。
但实现方法1中,
1,容器类BookList承担了太多功能:一方面需要提供添加删除等BookList本身应有的功能;一方面还需要提供遍历访问功能。
2,往往容器在实现遍历的过程中,需要保存遍历状态,当跟元素的添加删除等功能夹杂在一起,很容易引起混乱和程序运行错误等。
在实现方法2中,
容器本身未实现任何遍历方法,把这个遍历的任务交给了调用者,这样一来,暴露了容器本身的实现细节,如果一旦容器内部的数据接口发生变化,比如由于某种原因,BookList的List bookList用Map bookList来实现,这样,所有调用方的程序不得不随着BookList的修改而修改。
Iterator模式很好地解决了以上问题。
我们先从JDK中的Collection Framework对Iterator模式的实现方法来说明Iterator模式。
Java Collections Framework - Java集合框架List,Map,Set等全面介绍之概要篇
Java Collection Framework对迭代模式的经典实现
1,迭代接口:Iterator接口,定义了遍历接口:
public interface Iterator
{
//判断是否存在下一个元素
public abstract boolean hasNext();
//返回下一个可用的元素
public abstract Object next();
//移除当前元素
public abstract void remove();
}
{
//判断是否存在下一个元素
public abstract boolean hasNext();
//返回下一个可用的元素
public abstract Object next();
//移除当前元素
public abstract void remove();
}
2,容器接口:Collection接口,定义了iterator()方法,把遍历委让给Iterator的实现类。
public interface Collection
extends Iterable
{
...
//取得对所有元素的遍历。可以通过Iterator提供的方法遍历集合的元素
public abstract Iterator iterator();
...
}
extends Iterable
{
...
//取得对所有元素的遍历。可以通过Iterator提供的方法遍历集合的元素
public abstract Iterator iterator();
...
}
3,容器接口Collection的实现类与迭代接口Iterator的实现类:
public abstract class AbstractList extends AbstractCollection implements List {
...
//负责创建具体迭代器角色的工厂方法
public Iterator iterator() {
//把遍历委让给Iterator的实现类Itr。
return new Itr();
}
//迭代接口Iterator的实现类
private class Itr implements Iterator {
...
}
...
}
public class ArrayList extends AbstractList {
...
}
...
//负责创建具体迭代器角色的工厂方法
public Iterator iterator() {
//把遍历委让给Iterator的实现类Itr。
return new Itr();
}
//迭代接口Iterator的实现类
private class Itr implements Iterator {
...
}
...
}
public class ArrayList extends AbstractList {
...
}
以上说明了Java Collection Framework里的对Iterator模式的基本实现方法。
这也是Iterator模式一种经典的实现方案。
经典的Iterator模式实现方案
下面是一种比较经典的Iterator模式实现方案,该实现方案基于接口设计原则,设计了以下几个接口或类:迭代器接口Iterator:该接口必须定义实现迭代功能的最小定义方法集比如提供hasNext()和next()方法。
迭代器实现类:迭代器接口Iterator的实现类。可以根据具体情况加以实现。
容器接口:定义基本功能以及提供类似Iterator iterator()的方法。
容器实现类:容器接口的实现类。必须实现Iterator iterator()方法。
Iterator模式的类图:
[该图出自Wikipedia]
应用我们的上面介绍的例子,我们需要定义以下几个接口与类:
public class public interface IBookList {
public BookListIterator iterator();
}
BookListImpl implements IBookList {
public BookListIterator iterator() {
return new BookListIteratorImpl(this);
}
}
public interface BookListIterator {
public boolean hasNext();
public Book next();
}
public class BookListIteratorImpl implements BookListIterator {
...(具体实现过程略)
}
public BookListIterator iterator();
}
BookListImpl implements IBookList {
public BookListIterator iterator() {
return new BookListIteratorImpl(this);
}
}
public interface BookListIterator {
public boolean hasNext();
public Book next();
}
public class BookListIteratorImpl implements BookListIterator {
...(具体实现过程略)
}
对容器的遍历方法例:
IBookList list = ...;
BookListIterator it = list.iterator();
while(it.hasNext()){
Book book = it.next();
...
}
BookListIterator it = list.iterator();
while(it.hasNext()){
Book book = it.next();
...
}
Iterator模式的优点
1,实现功能分离,简化容器接口。让容器只实现本身的基本功能,把迭代功能委让给外部类实现,符合类的设计原则。2,隐藏容器的实现细节。
3,为容器或其子容器提供了一个统一接口,一方面方便调用;另一方面使得调用者不必关注迭代器的实现细节。
4,可以为容器或其子容器实现不同的迭代方法或多个迭代方法。
发表评论
-
设计模式之 State - 状态模式
2010-12-18 16:49 1121State模式也叫状态模式,是由GoF提出的23种软件设计模式 ... -
设计模式之 Strategy - 策略模式
2010-12-18 16:46 1390Strategy模式也叫策略模 ... -
设计模式之 Visitor - 访问者模式
2010-12-18 16:45 1483Visitor模式也叫访问者 ... -
设计模式之 Template Method - 模板方法模式
2010-12-18 16:41 1601Template Method模式也叫模板方法模式,是由G ... -
设计模式之 Observer - 观察者模式
2010-12-18 16:33 1436Observer模式也叫观察者 ... -
设计模式之 Memento - 备忘录模式
2010-12-18 16:31 1092Memento模式也叫备忘录 ... -
设计模式之 Mediator - 中介者模式
2010-12-18 16:29 1149Mediator模式也叫中介者模式,是由GoF提出的23种软件 ... -
设计模式之 Interpreter - 解释器模式
2010-12-18 16:23 1031Interpreter模式也叫解释器模式,是由GoF提出的 ... -
设计模式之 Command - 命令模式
2010-12-18 16:20 926Command(CoR)模式也叫命 ... -
设计模式之 Chain of Responsibility - 职责链模式
2010-12-18 16:18 1234Chain of Responsibility(CoR)模 ... -
设计模式之 Proxy - 代理模式
2010-12-16 23:45 1089Proxy模式也叫代理模式,是由GoF提出的23种软件设计 ... -
设计模式之 Flyweight - 享元模式
2010-12-16 23:42 1084Flyweight模式也叫享元模式,是由GoF提出的23种 ... -
设计模式之 Facade - 外观模式
2010-12-16 23:41 1044Facade模式也叫外观模式 ... -
设计模式之 Singleton - 单态模式
2010-11-26 11:58 887Singleton模式也叫单态模式,是由GoF提出的2 ... -
设计模式之 Decorator - 装饰模式
2010-11-25 23:48 837装饰模式,The Decorator Pattern atta ... -
设计模式之 Composite - 组合模式
2010-11-25 23:35 1494Composite模式也叫组合 ... -
设计模式之 Bridge - 桥接模式
2010-11-25 23:08 1044Bridge模式也叫桥接模式,是由GoF提出的23种软件设计模 ... -
设计模式之 Adapter - 适配器模式
2010-11-25 22:58 951Adapter模式也叫适配器模式,是由GoF提出的23种设 ... -
设计模式之Prototype - 原型模式
2010-11-25 22:14 1165Prototype模式也叫原型模式,是由GoF提出的23种设计 ... -
设计模式之 Builder - 建造者模式
2010-11-18 23:51 1100Builder模式也叫建造者模式或者生成器模式,是由GoF ...
相关推荐
迭代器模式是软件设计模式中的一种行为模式,它在Android开发中被广泛应用,尤其是在处理集合对象的遍历操作时。这种模式提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。在Java或Android编程中,...
迭代器设计模式是一种常用的行为设计模式,它提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。这个“iterator-demo”应该是一个示例项目,用于演示如何在实际编程中应用迭代器模式。下面我们将深入...
迭代器模式是一种行为设计模式,它允许我们顺序访问聚合对象的元素,而无需暴露其底层表示。在Java中,迭代器模式广泛应用于集合框架,如ArrayList、LinkedList等。本示例将深入探讨如何在Java中实现和使用迭代器...
迭代器模式(IteratorPattern)是设计模式中的一种行为模式,它提供了一种顺序访问聚合对象元素的方法,同时又不暴露其底层表示。这种模式允许我们遍历集合对象的元素,而无需暴露其内部结构。在Java、C#等面向对象...
迭代器模式是软件设计模式中的一种行为模式,其主要目的是为了在不暴露聚合对象内部结构的情况下,提供一种顺序访问聚合对象中各个元素的方式。在Java中,迭代器模式被广泛应用于集合类,如ArrayList、LinkedList等...
迭代器模式是软件设计模式中的一种行为模式,它在C#等面向对象编程语言中有着广泛的应用。这个模式的主要目标是允许用户遍历一个聚合对象(如数组、集合或列表)的所有元素,而无需了解底层的实现细节。下面将详细...
C#面向对象设计模式 (行为型模式) Iterator 迭代器模式 视频讲座下载
- 迭代器模式(Iterator):提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。 - 中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。 - 备忘录模式(Memento):在不破坏封装性的前提下...
Java 迭代器模式是一种行为设计模式,它提供了一种访问集合对象元素的方法,而不需要暴露该对象的内部表示。该模式适用于需要遍历集合对象的场景,例如数组、列表、树等。 迭代器模式的主要优点是: 1. 避免了集合...
迭代器模式是软件设计模式中的一种行为模式,它在编程中扮演着重要的角色,尤其是在处理集合数据时。迭代器模式的核心思想是提供一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。这种模式使得用户可以在不...
迭代器模式是一种软件设计模式,它提供了一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。在iOS开发中,迭代器模式同样适用,可以帮助开发者在不暴露内部数据结构的情况下遍历集合对象。下面我们将深入...
迭代器模式是一种行为设计模式,它提供了一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。这种模式允许我们遍历集合中的每个元素,同时保持集合本身抽象,不需了解其内部结构。 在Java、C#等面向对象语言...
迭代器模式是软件设计模式中的行为模式之一,它在C++编程中有着广泛的应用。这个模式提供了一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。通过迭代器,用户可以遍历集合中的所有元素,而无需知道如何...
### C++设计模式之迭代器(Iterator)模式详解 #### 一、引言 在软件开发过程中,设计模式是解决特定问题的一种通用解决方案。其中,迭代器模式是一种常用的模式,它提供了一种方法来访问一个容器对象中的各个元素...
2.定义一个Iterator迭代器的接口 3.定义一个ArrayList,实现Collection接口,并写一个实现了Iterator接口的内部类。 4.编写测试程序TestMain 从以上可以看出,设计模式到处用到面向对象中的多态。接口调用子类中的...
根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...
在Java编程语言中,集合框架是处理对象数组的核心部分,而迭代器设计模式则是访问集合元素的主要机制。本文将深入探讨Java中的迭代器模式及其在集合框架中的应用。 迭代器模式是一种行为设计模式,它提供了一种方法...
迭代器模式是软件设计模式中的行为模式之一,它提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。在Java编程语言中,迭代器模式的应用尤为广泛,尤其是在处理集合类如ArrayList、LinkedList等时。这...
迭代器模式(Iterator Pattern)是Java设计模式中的行为模式之一,它提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。在Java中,迭代器模式被广泛应用于集合类,如ArrayList、LinkedList等,通过...