迭代器模式

标签: 设计模式

初识迭代器模式 定义

提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示 。

结构和说明

image_1cihcf6941lqc1li04991k4fko9.png-64.9kB


Iterator:
迭代器接口。定义访问和遍历元素的接口。
ConcreteIterator:
具体的迭代器实现对象。实现对聚合对象的遍历,并跟踪遍历时的当前位置。
Aggregate:
聚合对象。定义创建相应迭代器对象的接口。
ConcreteAggregate:
具体聚合对象。实现创建相应的迭代器对象。

/** * 迭代器接口,定义访问和遍历元素的操作 */ public interface Iterator { /** * 移动到聚合对象的第一个位置 */ public void first(); /** * 移动到聚合对象的下一个位置 */ public void next(); /** * 判断是否已经移动聚合对象的最后一个位置 * @return true表示已经移动到聚合对象的最后一个位置, * false表示还没有移动到聚合对象的最后一个位置 */ public boolean isDone(); /** * 获取迭代的当前元素 * @return 迭代的当前元素 */ public Object currentItem(); } ---------- /** * 具体迭代器实现对象,示意的是聚合对象为数组的迭代器 * 不同的聚合对象相应的迭代器实现是不一样的 */ 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); } } ---------- /** * 聚合对象的接口,定义创建相应迭代器对象的接口 */ public abstract class Aggregate { /** * 工厂方法,创建相应迭代器对象的接口 * @return 相应迭代器对象的接口 */ public abstract Iterator createIterator(); } ---------- /** * 具体的聚合对象,实现创建相应迭代器对象的功能 */ 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; } } ---------- 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(); } } 体会迭代器模式 工资表数据的整合

这个项目的背景是这样的,项目的客户方收购了一家小公司,这家小公司有自己的工资系统,现在需要整合到客户方已有的工资系统上。
现在除了要把两个工资系统整合起来外,老板还希望能够通过决策辅助系统来统一查看工资数据,他不想看到两份不同的工资表。那么应该如何实现呢?

/** * 工资描述模型对象 */ public class PayModel { /** * 支付工资的人员 */ private String userName; /** * 支付的工资数额 */ private double pay; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public double getPay() { return pay; } public void setPay(double pay) { this.pay = pay; } public String toString(){ return "userName="+userName+",pay="+pay; } } ---------- /** * 客户方已有的工资管理对象 */ public class PayManager{ /** * 聚合对象,这里是Java的集合对象 */ private List list = new ArrayList(); /** * 获取工资列表 * @return 工资列表 */ 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 class SalaryManager{ /** * 用数组管理 */ 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 class Client { public static void main(String[] args) { //访问集团的工资列表 PayManager payManager= new PayManager(); //先计算再获取 payManager.calcPay(); Collection payList = payManager.getPayList(); Iterator it = payList.iterator(); System.out.println("集团工资列表:"); while(it.hasNext()){ PayModel pm = (PayModel)it.next(); System.out.println(pm); } //访问新收购公司的工资列表 SalaryManager salaryManager = new SalaryManager(); //先计算再获取 salaryManager.calcSalary(); PayModel[] pms = salaryManager.getPays(); System.out.println("新收购的公司工资列表:"); for(int i=0;i<pms.length;i++){ System.out.println(pms[i]); } } } 有何问题

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

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