您的位置:首页 > 其它

设计模式入门之迭代器模式Iterator

2014-05-05 23:31 381 查看
迭代器模式定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部实现

迭代器模式的结构和说明



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,这样可以更好地理解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息