迭代器模式(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
@@@模式的本质:
控制访问聚合对象中的元素。
@@@模式体现的设计原则:
单一职责原则
迭代器模式(Iterator)的更多相关文章
- 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)
上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...
- 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)
设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型) 1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的 ...
- 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...
- 迭代器模式 Iterator 行为型 设计模式(二十)
迭代器模式(Iterator) 走遍天下,世界那么大,我想去看看 在计算机中,Iterator意为迭代器,迭代有重复的含义,在程序中,更有“遍历”的含义 如果给定一个数组,我们可以通过for循 ...
- 迭代器模式-Iterator(Java实现)
迭代器模式-Iterator 用于访问一个集合中的各个元素, 而又不会暴露集合的内部的细节. 本文展示的例子就是, 在猫群组里, 用迭代器遍历每一只猫. 本文章的例子的继承关系图如下: 其中: Cat ...
- Java 设计模式系列(十五)迭代器模式(Iterator)
Java 设计模式系列(十五)迭代器模式(Iterator) 迭代器模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(interna ...
- 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)
设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...
- 二十四种设计模式:迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现 ...
- 设计模式 - 迭代器模式(iterator pattern) 具体解释
迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一 ...
- 设计模式系列之迭代器模式(Iterator Pattern)——遍历聚合对象中的元素
模式概述 模式定义 模式结构图 模式伪代码 模式改进 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修 ...
随机推荐
- web理论知识--HTML结构及标签
一.参考书籍: <Web 前端开发 HTML5+CSS3+jQuery+AJAX 从学到用完美实践> 备注:本书为工具书. 二.HTML5元素: 按功能划分:基础.格式.表单.框架.图像. ...
- 压缩归档文件审查工具p7zip-full
压缩归档文件审查工具p7zip-full 在数字取证中,会遇到各种形式的压缩文件和归档文件.为了处理这些不同的文件,Kali Linux提供了专用工具p7zip-full.该工具支持各种格式的压缩 ...
- bzoj3628: [JLOI2014]天天酷跑
题目链接 bzoj3628: [JLOI2014]天天酷跑 题解 开始读错题目了,尴尬 由于题目说的跳跃次数和高度是在一开始设定的. 发现枚举一下记忆化搜索就可以过了 要注意,跳到最高点是可以不下坠继 ...
- luogu P4779 【模板】单源最短路径(标准版)
线段树优化dij 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 我可能是个智障 // luogu-judger-enable-o2 #pragma GCC diagnostic error "-std= ...
- 大学启示录I 浅谈大学生的学习与就业
教育触感 最近看了一些书,有了一些思考,以下纯属博主脑子被抽YY的一些无关大雅的思考,如有雷同,纯属巧合.. 现实总是令人遗憾的,我们当中太多人已经习惯于沿着那一成不变的"典型成功道路&qu ...
- 吴恩达-coursera-机器学习-week5
九.神经网络的学习(Neural Networks: Learning) 9.1 代价函数 9.2 反向传播算法 9.3 反向传播算法的直观理解 9.4 实现注意:展开参数 9.5 梯度检验 9.6 ...
- Codeforces Round #373 (Div. 2) A. Vitya in the Countryside 水题
A. Vitya in the Countryside 题目连接: http://codeforces.com/contest/719/problem/A Description Every summ ...
- JavaScript获取事件对象和目标对象
在JavaScript开发中,经常需要获取触发某个事件的目标对象.让后根据目标对象进行不同的业务处理.下面展示通过JavaScript获取触发事件的事件目标对象.如下: Js代码 1 2 3 4 5 ...
- LPC-LINK 2 Board IO TABLE
- LPC18xx and LPC43xx 选型及差异
Q LPC43xx和LPC18xx有相同的USB接口以及片内USB驱动吗?A 是的. Q LPC4300和LPC1800只是内核不同吗?外设和管脚配置都完全一致?A 为LPC18xx的映像可以直接在L ...