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

@@@练习示例: 

工资表数据的整合

@@@示例代码:

\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

@@@模式的本质:

控制访问聚合对象中的元素。

@@@模式体现的设计原则:

单一职责原则

最新文章

  1. 关于reset.css的疑问:为什么一定要重置浏览器样式?
  2. How to tile small texture image onto page as its background
  3. YTU 3019: 螺旋方阵
  4. xampp改到phpmyadmin的root密碼無法登錄
  5. curl命令的基本用法
  6. java高并发,如何解决,什么方式解决
  7. 你真的会用UIButton吗? UIButton详细介绍
  8. App接口设计原则-b
  9. 解决在Linux下安装Oracle时的中文乱码问题
  10. 3D转换
  11. checkSelfPermission 找不到 Android 动态权限问题
  12. nessus重置密码
  13. BZOJ 3544: [ONTAK2010]Creative Accounting [set]
  14. ubuntu 开发板ping通虚拟机挂载nfs服务器
  15. ABAP调试
  16. C#1到C#4使用委托的几种方式
  17. [20181108]12c sqlplus rowfetch参数4.txt
  18. Query the tables and index which will caus rebuild index fail
  19. Maven学习 二 Maven环境搭建
  20. c# 生成验证码图片

热门文章

  1. rabbitmq学习(九) —— 关于消息队列的选型
  2. Android中,利用Intent传递对象值
  3. 工具使用-----Jmeter-脚本的录制
  4. How Visual Studio 2012 Avoids Prompts for Source
  5. Android ListView中按钮监听器设置的解决方案
  6. windows操作系统查看占用端口的进程
  7. 对json数据key进行替换
  8. 【python】python安装步骤
  9. WordPress主题开发: 制作文章页面single.php
  10. c++ 实现atoi()函数