迭代器模式(Iterator)

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

@@@练习示例: 
工资表数据的整合

@@@示例代码:
\pattern\PayModel.java

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

/**
 * 工资描述模型对象
 */
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;
	}
}


\pattern\Iterator.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

/**
 * 迭代器接口,定义访问和遍历元素的操作
 */
public interface Iterator {
    /**
     * 移动到聚合对象的第一个位置
     */
	public void first();
	
	/**
	 * 移动到聚合对象的下一个位置
	 */
	public void next();
	
	/**
	 * 判断是否已经移动到聚合对象的最后一个位置
	 * @return true 表示已经移动到聚合对象的最后一个位置
	 *         false 表示还没有移动到聚合对象的最后一个位置
	 */
	public boolean isDone();
	
	/**
	 * 获取迭代的当前元素
	 * @return 迭代的当前元素
	 */
	public Object currentItem();
}

\pattern\CollectionIteratorImpl.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

/**
 * 用来实现访问Collection集合的迭代接口,为了外部统一访问方式
 */
public class CollectionIteratorImpl implements Iterator {
	/**
     * 用来存放被迭代的聚合对象
     */
	private PayManager aggregate = null;
	
	/**
	 * 用来记录当前迭代到的位置索引
	 * -1表示刚开始的时候,迭代器指向对和对象第一个对象之前
	 */
	private int index = -1;
	
	public CollectionIteratorImpl(PayManager aggregate) {
		this.aggregate = aggregate;
	}

	@Override
	public void first() {
        index = 0;
	}

	@Override
	public void next() {
        if (index < this.aggregate.size()) {
        	index = index + 1;
        }
	}
	
	@Override
	public boolean isDone() {
		if (index == this.aggregate.size()) {
			return true;
		}
		
		return false;
	}

	@Override
	public Object currentItem() {
		return this.aggregate.get(index);
	}
}

\pattern\ArrayIteratorImpl.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

/**
 * 用来实现访问数组的迭代接口
 */
public class ArrayIteratorImpl implements Iterator {
    /**
     * 用来存放被迭代的聚合对象
     */
	private SalaryManager aggregate = null;
	
	/**
	 * 用来记录当前迭代到的位置索引
	 * -1表示刚开始的时候,迭代器指向对和对象第一个对象之前
	 */
	private int index = -1;
	
	public ArrayIteratorImpl(SalaryManager aggregate) {
		this.aggregate = aggregate;
	}

	@Override
	public void first() {
        index = 0;
	}

	@Override
	public void next() {
        if (index < this.aggregate.size()) {
        	index = index + 1;
        }
	}

	@Override
	public boolean isDone() {
		if (index == this.aggregate.size()) {
			return true;
		}
		
		return false;
	}
	
	@Override
	public Object currentItem() {
		return this.aggregate.get(index);
	}
}

\pattern\Aggregate.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

public abstract class Aggregate {
    /**
     * 工厂方法,创建相应迭代器对象的接口
     * @return 相应迭代器对象的接口
     */
    public abstract Iterator createIterator();
}

\pattern\PayManager.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

import java.util.ArrayList;
import java.util.List;

/**
 * 客户方已有的工资管理对象
 */
public class PayManager extends Aggregate {
    /**
     * 聚合对象,这里是Java的集合对象
     */
	private List list = new ArrayList();
	
	/**
	 * 获取工资列表
	 */
	public List getPayList() {
		return list;
	}
	
	/**
	 * 计算工资,其实应该有很多参数,此处从简
	 */
	public void calcPay() {
		// 计算工资,并把工资信息填充到工资列表中
		// 为了测试,输入些数据进去
		PayModel pm1 = new PayModel();
		pm1.setPay(3000);
		pm1.setUserName("张三");
		PayModel pm2 = new PayModel();
		pm2.setPay(5000);
		pm2.setUserName("李四");
		
		list.add(pm1);
		list.add(pm2);
	}
	
	public Iterator createIterator() {
		return new CollectionIteratorImpl(this);
	}
	
	public Object get(int index) {
		Object retObj = null;
		if (index < this.list.size()) {
			retObj = this.list.get(index);
		}
		
		return retObj;
	}
	
	public int size() {
		return this.list.size();
	}
}

\pattern\SalaryManager.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

/**
 * 被客户方收购的那个公司的工资管理类
 */
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;
	}
}

\user\Client.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package user;

import pattern.Iterator;
import pattern.PayManager;
import pattern.SalaryManager;

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) {
		// 循环输出聚合对象中的值
		// 首先设置迭代器到第一个元素
		it.first();
		while(!it.isDone()) {
			// 取出当前元素
			Object obj = it.currentItem();
			System.out.println("the obj==" + obj);
			// 如果还没有迭代到最后,那么就向下迭代一个
			it.next();
		}
	}
}

@@@模式的实现:
1. 迭代器围绕着“访问”可以延伸出许多功能;
2. 有内部迭代器和外部迭代器之分;

@@@模式的优点:
1. 更好的封装性;
2. 可以以不同的遍历方式来遍历一个聚合;
3. 迭代器简化了聚合的接口;
4. 简化客户端调用;
5. 同一个聚合上可以有多个遍历

@@@模式的缺点:
NA

@@@模式的本质:
控制访问聚合对象中的元素。

@@@模式体现的设计原则:
单一职责原则

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值