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);
}
}
}
带迭代策略的迭代器