迭代器模式 (4)

4:Java中最简单的统一访问聚合的方式
如果只是想要使用一种统一的访问方式来访问聚合对象,在Java中有更简单的方式,简单到几乎什么都不用做,利用Java 5以上版本本身的特性即可。
但是请注意,这只是从访问形式上一致了,但是也暴露了聚合的内部实现,因此并不能算是标准迭代器模式的实现,但是从某种意义上说,可以算是隐含的实现了部分迭代器模式的功能。

使用Java的迭代器

大家都知道,在java.util包里面有一个Iterator的接口,在Java中实现迭代器模式是非常简单的,而且java的集合框架中的聚合对象,基本上都是提供了迭代器的。
下面就来把前面的例子改成用Java中的迭代器实现,一起来看看有些什么改变。
1:不再需要自己实现的Iterator接口,直接实现java.util.Iterator接口就可以了,所有使用自己实现的Iterator接口的地方都需要修改过来
2:Java中Iterator接口跟前面自己定义的接口相比,需要实现的方法是不一样的
3:集合已经提供了Iterator,那么CollectionIteratorImpl类就不需要了,直接去掉

/** * 聚合对象的接口,定义创建相应迭代器对象的接口 */ public abstract class Aggregate { /** * 工厂方法,创建相应迭代器对象的接口 * @return 相应迭代器对象的接口 */ public abstract Iterator createIterator(); } ---------- /** * 客户方已有的工资管理对象 */ public class PayManager extends Aggregate{ private List<PayModel> list = new ArrayList<PayModel>(); /** * 获取工资列表 * @return 工资列表 */ public List<PayModel> 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 Iterator createIterator() { return list.iterator(); } } ---------- /** * 被客户方收购的那个公司的工资管理类 */ public class SalaryManager extends Aggregate{ /** * 用数组管理 */ private PayModel[] pms = null; /** * 获取工资列表 * @return 工资列表 */ public PayModel[] getPays(){ return pms; } /** * 计算工资,其实应该有很多参数,为了演示从简 */ public void calcSalary(){ //计算工资,并把工资信息填充到工资列表里面 //为了测试,做点假数据进去 PayModel pm1 = new PayModel(); pm1.setPay(2200); pm1.setUserName("王五"); PayModel pm2 = new PayModel(); pm2.setPay(3600); pm2.setUserName("赵六"); pms = new PayModel[2]; pms[0] = pm1; pms[1] = pm2; } public Iterator createIterator(){ return new ArrayIteratorImpl(this); } public Object get(int index){ Object retObj = null; if(index < pms.length){ retObj = pms[index]; } return retObj; } public int size(){ return this.pms.length; } } ---------- import java.util.Iterator; /** * 用来实现访问数组的迭代接口 */ public class ArrayIteratorImpl implements Iterator{ /** * 用来存放被迭代的聚合对象 */ private SalaryManager aggregate = null; /** * 用来记录当前迭代到的位置索引 */ private int index = 0; public ArrayIteratorImpl(SalaryManager aggregate){ this.aggregate = aggregate; } public boolean hasNext() { //判断是否还有下一个元素 if(aggregate!=null && index<aggregate.size()){ return true; } return false; } public Object next() { Object retObj = null; if(hasNext()){ retObj = aggregate.get(index); //每取走一个值,就把已访问索引加1 index++; } return retObj; } public void remove() { //暂时可以不实现 } } ---------- 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()); } /** * 测试通过访问聚合对象的迭代器,是否能正常访问聚合对象 * @param it 聚合对象的迭代器 */ private static void test(Iterator it){ while(it.hasNext()){ PayModel pm = (PayModel)it.next(); System.out.println(pm); } } } 带迭代策略的迭代器

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsfpp.html