迭代器模式定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部实现
迭代器模式的结构和说明
Iterator::迭代器接口。定义访问和遍历元素的接口
ConcreteIterator:具体的迭代器实现对象。实现对聚合对象的遍历,并跟踪遍历时的当前位置
Aggregate:聚合对象。定义创建相应迭代器对象的接口
ConcreteAggregate:具体聚合对象。实现创建相应的迭代器对象
实例:一个公司,工资列表是用List实现的,后收购一家公司,工资列表是用Array实现的,现在需要开发一种统一的方式来访问两种不同的聚合对象,上代码
//工资描述模型对象 public class PayModel { private String userName; private double pay; //get and set methods } //获取访问聚合接口的接口 public interface Aggregate { public Iterator createIterator(); public int size(); public Object get(int index); } //已有的工资管理对象 public class PayManager implements Aggregate{ public Iterator createIterator() { return new AgIteratorImpl((Aggregate)this); } private List list = new ArrayList(); public List getPayList() { return list; } public void calcPay() { PayModel pm1 = new PayModel(); pm1.setPay(3800); pm1.setUserName("张三"); PayModel pm2 = new PayModel(); pm2.setPay(5800); pm2.setUserName("李四"); list.add(pm1); list.add(pm2); } public Object get(int index) { Object obj = null; if(index < this.list.size()) { obj = this.list.get(index); } return obj; } public int size() { return this.list.size(); } } //被收购放的工资管理类 public class SalaryManager implements Aggregate { public Iterator createIterator() { return new AgIteratorImpl((Aggregate)this); } private PayModel[] pms = null; public PayModel[] getPays() { return pms; } public void calcSalary() { PayModel pm1 = new PayModel(); pm1.setPay(2800); pm1.setUserName("王五"); PayModel pm2 = new PayModel(); pm2.setPay(6800); pm2.setUserName("赵六"); pms = new PayModel[2]; pms[0] = pm1; pms[1] = pm2; } public Object get(int index) { Object obj = null; if(index < this.pms.length) { obj = this.pms[index]; } return obj; } public int size() { return this.pms.length; } } //统一访问聚合对象的接口 public interface Iterator { public void first(); public void next(); public boolean isDone(); public Object currentItem(); } //访问数组的统一迭代接口 public class AgIteratorImpl implements Iterator{ private Aggregate aggregate = null; private int index = -1; public AgIteratorImpl(Aggregate 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); } } //客户端调用 public class Client { public static void main(String[] args) { PayManager payManager = new PayManager(); payManager.calcPay(); System.out.println("集团工资列表:"); test(payManager.createIterator()); SalaryManager salaryManager = new SalaryManager(); salaryManager.calcSalary(); System.out.println("新收购公司工资列表:"); test(salaryManager.createIterator()); } private static void test(Iterator it) { it.first(); while(!it.isDone()) { Object obj = it.currentItem(); System.out.println("the obj="+obj); it.next(); } } } //以上并没有使用Java自带的Iterator,这样可以更好地理解
设计模式入门之迭代器模式Iterator,布布扣,bubuko.com
原文地址:http://blog.csdn.net/herewjxiang/article/details/25079539