设计模式学习笔记(十三)—Iterator迭代器模式

Iterator模式定义:

提供一个方法顺序访问一个聚合对象的各个元素,而又不暴露该对象的内部表示。

这个模式在java的类库中已经实现了,在java中所有的集合类都实现了Conllection接口,而Conllection接口又继承了Iterable接口,该接口有一个iterator方法,也就是所以的集合类都可以通过这个iterator方法来转换成Iterator类,用Iterator对象中的hasnext方法来判断是否还有下个元素,next方法来顺序获取集合类中的对象。今天面试考到设计模式,我愣是没答上来,我晕死,自己这几天刚学的东西,自己也都理解,可一到考试的时候不是忘了就是回答的不准确,自己也不清楚到底是为什么,哎,伤心。。。。。。,下面是Iterator模式的结构图:

在这个结构图中的Aggregate抽象类也可以定义成接口。下面给出一个例子来说明Iterator模式的使用。

import java.util.ArrayList;

interface Iterator<E>{
public void first();
public void next();
public E currentItem();
public boolean isDone();
}
class ConcreteIterator<E> implements Iterator<E>{

private ConcreteAggregate<E> agg;
private int index=0;
private int size=0;

  public ConcreteIterator( ConcreteAggregate<E> aggregate) {
 this.agg=aggregate;
 this.index=0;
 this.size=aggregate.size();
}

public E currentItem() {
 return agg.getElement(index);
}

public void first() {
 index=0;
}

public boolean isDone() {
 if(index>=size){
 return true;
 }
 return false;
}

public void next() {
 if(index<size){
 index++;
   }
  }
}
abstract class Aggregate<E>{
protected abstract Iterator createIterator();
}
class ConcreteAggregate<E> extends Aggregate<E>{
private ArrayList<E> arrayList=new ArrayList<E>();
public Iterator createIterator() {

 return new ConcreteIterator<E>(this);
}
public void add(E o){
 arrayList.add(o);
}
public E getElement(int index) {

    if (index<arrayList.size()) {

     return arrayList.get(index);

    } else {

     return null;

    }

  }

  public int size(){

    return arrayList.size();

  }

}

public class Client {

public static void main(String[] args) {
 ConcreteAggregate<String> aggregate=new ConcreteAggregate<String>();
 aggregate.add("A");
 aggregate.add("B");
 aggregate.add("C");
 aggregate.add("D");
 aggregate.add("E");
 Iterator iterator=aggregate.createIterator();
 for(iterator.first();!iterator.isDone();iterator.next()){
 System.out.println(iterator.currentItem());
 }

}
}

输出结果:

A

B

C

D

E

在这个例子中,我们按照Iterator模式的结构图来创建的例子,我们创建的集合ConcreteAggregate可以存放任何类型的数据,然后使用createIterator方法转换成Iterator对象,使用Iterator对象来按顺序显示集合中的内容。这个模式在Java的jdk中是这样实现的,所以的集合类都实现了Iterable接口,这个接口中有一个iterator方法可以把集合类的对象转换成Iterator类的对象。明白这个原理可以更好的理解Java中的集合类和迭代器,根据这个可以创建功能更加强大的集合类。

小结:Iterator模式主要用在当一个集合类中的元素经常变动时,而不需要改变客户端的代码。

时间: 2024-12-22 08:09:34

设计模式学习笔记(十三)—Iterator迭代器模式的相关文章

设计模式学习笔记(十)—Factory Method模式

<设计模式>一书对Factory Method模式是这样描述的: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.FactoryMethod使一个类的实例化延迟到其子类. 我的理解:FatoryMethod模式是一种创建型模式,定义一个用于创建对象的接口的意思是说,我们要定义一个用于创建对象的接口(或者说抽象类,实际上就是个抽象工厂abstractFactory),它的内部有一个创建对象的方法,这个方法的返回值是一个接口(或者抽象类)的类型,这个方法就是FactoryMethod:让子类

设计模式学习笔记(三)—-Strategy策略模式

GOF<设计模式>一书对Strategy模式是这样描述的: 定义一系列的算法,把他们一个个封装起来,并且使它们可相互替换.Strategy模式使算法可独立于使用它的客户而变化. Strategy模式以下列几条原则为基础: 1)每个对象都是一个具有职责的个体. 2)这些职责不同的具体实现是通过多态的使用来完成的. 3)概念上相同的算法具有多个不同的实现,需要进行管理. 下面我将通过一个实例来说明它的具体使用,这个例子是关于数据库连接的.代码如下: interface DatabaseStrate

设计模式学习笔记(一) Facade外观模式

GOF<设计模式>一书对Facade模式是这样描述的: 为子系统中的一组接口提供一个统一接口.Facade模式定义了一个更高层的接口,使子系统更加容易使用. 大致意思是说:使用一种比原有方式更简单的办法与系统交互.例如,我们把一个很文件的文件,放在了第二抽屉里,而第二个抽屉的钥匙放在了第一个抽屉里,我们要想取出这个文件,第一步肯定要拿到第一个抽屉的钥匙,然后打开它再拿出第二个抽屉的钥匙,最后打开第二个抽屉取出文件. 我就上面说的那个情形写一下实现代码,首先我们要实现二个子系统,呵呵,把抽屉比喻

设计模式学习笔记(二十一)—Composite模式

今天开始学习Composite模式,首先让我们看一下它的定义: 将对象组合成树形结构以表示"整体-部分"的层次结构.Composite模式使单个对象和组合对象的使用具有一致性. 下面给出这个模式的结构图: 如果把Composite模式看成是树形结构的话,那么它主要角色有: 1)树干角色(Component):该角色是一个抽象类,它定义了一些操作增删树叶(Leaf)的操作. 2)树枝角色(Composite):树枝上有很多树干,树枝也是树干的一种. 3)树叶角色(Leaf):树干上的树叶

设计模式学习笔记(十六)—Proxy模式

一.Proxy模式定义: 为其他对象提供一种代理以控制这个对象的访问. 二.模式解说 Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上.在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层,这个访问层也叫代理.Proxy模式是最常见的模式,在我们生活中处处可见,例如我们买火车票

设计模式学习笔记(八)—Template Method模式

<设计模式>一书对Template Method模式是这样描述的: 定义一个操作中算法的骨架,而将一些步骤延迟到子类中.不改变算法的结构而重新定义它的步骤. 我的理解:定义一个抽象类或者说接口,在它的内部定义一些抽象的方法(供TemplateMethod调用的步骤)和一个TemplateMethod方法(非抽象方法),封装了这些抽象方法的接口或抽象类就是骨架.而将它的实现延迟到子类中,也就是用子类实现它.不改变算法的结构而重新定义它的步骤,也就是改写或者实现父类的这些非TemplateMeth

设计模式学习笔记(四)—Bridge桥接模式

<设计模式>一书对Bridge是这样描述的: 将抽象与其实现解耦,使它们都可以独立地变化. 大致意思是说:将一组实现与另一组使用他们的对象分离.这里的实现指的是抽象类及其派生类用来实现自己的对象(而不是抽象类的派生类,这些派生类被称为具体类).下面 是<Design Patterns Explained>书中的例子.其结构图如下: 下面是它的实现: abstract class Shape{ protected Drawing myDrawing; abstract public

设计模式学习笔记(十七)—Memento备忘录模式

一.模式定义: 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样就可以将该对象恢复到原先保存前的状态. 二.模式解说 在程序运行过程中,某些对象的状态处在转换过程中,可能由于某种原因需要保存此时对象的状态,以便程序运行到某个特定阶段,需要恢复到对象之前处于某个点时的状态.如果使用一些公有接口让其它对象来得到对象的状态,便会暴露对象的实现细节. 三.结构图 1) 备忘录(Memento)角色:备忘录角色存储"备忘发起角色"的内部状态."备忘发起角色

设计模式学习笔记(十五)—State模式

一.State模式定义: 允许一个对象在其状态改变时,改变它的行为.看起来对象似乎修改了它的类. 二.模式解说 State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的处理操作的问题,而这样的问题,大部分人是采用switch-case语句进行处理的,这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对原来的代码进行编译.State模式采用了对这些不同的状态进行封装的方式处理这类问题,当状态改变的时候进行处理然后再切换到另一种状态,也就是说把状态的切换责任交给了具体的状态