当前位置:编程学习 > JAVA >>

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

概述
    给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
适用性
    1.访问一个聚合对象的内容而无需暴露它的内部表示。

    2.支持对聚合对象的多种遍历。

    3.为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)。
   
参与者
    1.Iterator
      迭代器定义访问和遍历元素的接口。

    2.ConcreteIterator
      具体迭代器实现迭代器接口。
      对该聚合遍历时跟踪当前位置。

    3.Aggregate
      聚合定义创建相应迭代器对象的接口。

    4.ConcreteAggregate
      具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例.

类图

示例代码:
package com.sql9.actioned; 
 
import java.util.ArrayList; 
import java.util.List; 
 
/**
 * 迭代器模式 实现示例
 * @author sean
 */ 
interface IIterator<T> { 
    T next(); 
    void first(); 
    void last(); 
    boolean hasNext(); 

 
class IIteratorImpl<T> implements IIterator<T> { 
    private IList<T> list; 
    private int index; 
     
    public IIteratorImpl (IList<T> list) { 
        index = 0; 
        this.list = list; 
    } 
     
    @Override 
    public T next() { 
        T t = list.get(index); 
        index++; 
        return t; 
    } 
 
    @Override 
    public void first() { 
        index = 0; 
    } 
 
    @Override 
    public void last() { 
        index = list.size(); 
    } 
 
    @Override 
    public boolean hasNext() { 
        return index < list.size(); 
    } 
     

 
interface IList<T> { 
    IIterator<T> iterator(); 
    T get(int index); 
    int size(); 
    void add(T obj); 

 
class IListImpl<T> implements IList<T> { 
    private List<T> list; 
    private int index; 
     
    public IListImpl() { 
        list = new ArrayList<T>(); 
        index = 0; 
    } 
     
    @Override 
    public IIterator<T> iterator() { 
        return new IIteratorImpl<T> (this); 
    } 
 
    @Override 
    public T get(int index) { 
        return list.get(index); 
    } 
 
    @Override 
    public int size() { 
        return list.size(); 
    } 
 
    @Override 
    public void add(T obj) { 
        list.add(obj); 
    } 
     

 
public class IteratorTest { 
 
    public static void main(String[] args) { 
        // 2 ways of iteration 
        IList<String> list = new IListImpl<String>(); 
        list.add("a"); 
        list.add("b"); 
        list.add("c"); 
         
        // 1st way  www.zzzyk.com
        System.out.println("1. using iterator to traverse:"); 
        IIterator<String> iter = list.iterator(); 
        while (iter.hasNext()) { 
            System.out.println(iter.next()); 
        } 
         
        // 2nd way 
        System.out.println("2. using list to traverse: "); 
        for (int i=0; i<list.size(); i++) { 
            System.out.println(list.get(i)); 
        } 
    } 
 

结果:
1. using iterator to traverse:
a
b
c
2. using list to traverse:
a
b
c

 

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,