@@@模式定义:
提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。
@@@练习示例:
工资表数据的整合
@@@示例代码:
patternPayModel.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; } }
patternIterator.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package pattern; /** * 迭代器接口,定义访问和遍历元素的操作 */ public interface Iterator { /** * 移动到聚合对象的第一个位置 */ public void first(); /** * 移动到聚合对象的下一个位置 */ public void next(); /** * 判断是否已经移动到聚合对象的最后一个位置 * @return true 表示已经移动到聚合对象的最后一个位置 * false 表示还没有移动到聚合对象的最后一个位置 */ public boolean isDone(); /** * 获取迭代的当前元素 * @return 迭代的当前元素 */ public Object currentItem(); }
patternCollectionIteratorImpl.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); } }
patternArrayIteratorImpl.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); } }
patternAggregate.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package pattern; public abstract class Aggregate { /** * 工厂方法,创建相应迭代器对象的接口 * @return 相应迭代器对象的接口 */ public abstract Iterator createIterator(); }
patternPayManager.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(); } }
patternSalaryManager.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; } }
userClient.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
@@@模式的本质:
控制访问聚合对象中的元素。
@@@模式体现的设计原则:
单一职责原则