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

2014-11-24 10:09:15 · 作者: · 浏览: 0

1.场景模拟
一个公司收购了另一个公司,现在需要整合两个公司之间的工资数据。但是两个公司,一个是用链表存储的,一个是用数组存储的,但是工资的数据模型差不多。
上述问题可以抽象为:如何能够以一个统一的方式来访问内部实现不同的聚合对象。

2.使用迭代器模式来解决
2.1迭代器定义
提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。

2.2迭代器的结构示意图
\

2.3迭代器示例代码

package demo13.iterator.example1;  
  
  
/** 
 * 迭代器接口,定义访问和遍历元素的操作 
 */  
public interface Iterator {  
    /** 
     * 移动到聚合对象的第一个位置 
     */  
    public void first();  
    /** 
     * 移动到聚合对象的下一个位置 
     */  
    public void next();  
    /** 
     * 判断是否已经移动聚合对象的最后一个位置 
     * @return true表示已经移动到聚合对象的最后一个位置, 
     *         false表示还没有移动到聚合对象的最后一个位置 
     */  
    public boolean isDone();  
    /** 
     * 获取迭代的当前元素 
     * @return 迭代的当前元素 
     */  
    public Object currentItem();  
}  
***********************************************************************  
package demo13.iterator.example1;  
  
  
/** 
 * 具体迭代器实现对象,示意的是聚合对象为数组的迭代器 
 * 不同的聚合对象相应的迭代器实现是不一样的 
 */  
public class ConcreteIterator implements Iterator {  
    /** 
     * 持有被迭代的具体的聚合对象 
     */  
    private ConcreteAggregate aggregate;  
    /** 
     * 内部索引,记录当前迭代到的索引位置。 
     * -1表示刚开始的时候,迭代器指向聚合对象第一个对象之前 
     */  
    private int index = -1;  
    /** 
     * 构造方法,传入被迭代的具体的聚合对象 
     * @param aggregate 被迭代的具体的聚合对象 
     */  
    public ConcreteIterator(ConcreteAggregate aggregate) {  
        this.aggregate = aggregate;  
    }  
  
  
    public void first(){  
        index = 0;  
    }  
    public void next(){  
        if(index < this.aggregate.size()){  
            index = index + 1;  
        }  
    }  
    public boolean isDone(){  
        if(index == this.aggregate.size()){  
            return true;  
        }  
        return false;  
    }  
    public Object currentItem(){  
        return this.aggregate.get(index);  
    }  
}  
***********************************************************************  
package demo13.iterator.example1;  
  
  
/** 
 * 聚合对象的接口,定义创建相应迭代器对象的接口 
 */  
public abstract class Aggregate {  
    /** 
     * 工厂方法,创建相应迭代器对象的接口 
     * @return 相应迭代器对象的接口 
     */  
    public abstract Iterator createIterator();  
}  
**********************************************************************  
package demo13.iterator.example1;  
  
  
/** 
 * 具体的聚合对象,实现创建相应迭代器对象的功能 
 */  
public class ConcreteAggregate extends Aggregate {  
    /** 
     * 示意,表示聚合对象具体的内容 
     */  
    private String[] ss = null;  
      
    /** 
     * 构造方法,传入聚合对象具体的内容 
     * @param ss 聚合对象具体的内容 
     */  
    public ConcreteAggregate(String[] ss){  
        this.ss = ss;  
    }  
      
    public Iterator createIterator() {  
        //实现创建Iterator的工厂方法   
        return new ConcreteIterator(this);  
    }  
    /** 
     * 获取索引所对应的元素 
     * @param index 索引 
     * @return 索引所对应的元素 
     */  
    public Object get(int index){  
        Object retObj = null;  
        if(index < ss.length){  
            retObj = ss[index];  
        }  
        return retObj;  
    }  
    /** 
     * 获取聚合对象的大小 
     * @return 聚合对象的大小 
     */  
    public int size(){  
        return this.ss.length;  
    }  
}  
**********************************************************************  
package demo13.iterator.example1;  
  
  
public class Client {  
    /** 
     * 示意方法,使用迭代器的功能。 
     * 这里示意使用迭代器来迭代聚合对象 
     */  
    public void someOperation(){  
        String[] names = {"张三","李四","王五"};  
        //创建聚合对象   
        Aggregate aggregate = new ConcreteAggregate(names);  
        //循环输出聚合对象中的值   
        Iterator it = aggregate.createIterator();  
        //首先设置迭代器到第一个元素   
        it.first();  
        while(!it.isDone()){  
            //取出当前的元素来   
            Object obj = it.currentItem();  
            System.out.println("the obj=="+obj);  
            //如果还没有迭代到最后,那么就向下迭代一个   
            it.next();  
        }  
    }     
    public static void main(String[] args) {  
        //可以简单的测试一下   
        Client client = new Client();  
        client.someOperation();  
    }  
}