本文目录
一、迭代器概述
1.1 优缺点
1.2 使用场景
1.3 注意事项
二、代码实现
2.1 通用类图
2.2 代码实现
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。迭代器模式属于行为型模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
主要解决:不同的方式来遍历整个整合对象。
何时使用:遍历一个聚合对象。
如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。
关键代码:定义接口:hasNext, next。
应用实例:JAVA 中的 iterator。
优点: 1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
使用场景: 1、访问一个聚合对象的内容而无须暴露它的内部表示。 2、需要为聚合对象提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。
注意事项:迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
所有设计模式的代码实现例子都可在码云上查看哦,感兴趣的可以查看哈,码云地址:https://gitee.com/no8g/java-design-patterns
上面的例子就使用了迭代器模式,我们来看看迭代器的通用类图:
类图是很简单,但是你看用起来就很麻烦,就比如上面例子的两个实现方法,你觉的那个简单?当然是第一个了!23 个设计模式是为了简化我们代码和设计的复杂度、耦合程度,为什么我们用了这个迭代器模式程序会复杂了一些呢?这是为什么?因为从 JDK 1.2 版本开始增加 java.util.Iterator 这个接口,并逐步把Iterator 应用到各个聚集类(Collection)中,我们来看 JDK 1.5 的 API 帮助文件,你会看到有一个叫java.util.Iterable 的接口,看看有多少个接口继承了它:
java.util.Iterable 接口只有一个方法:iterator(),也就说通过 iterator()这个方法去遍历聚集类中的所有方法或属性,基本上现在所有的高级的语言都有 Iterator 这个接口或者实现,Java 已经把迭代器给我们准备了,我们再去写迭代器,是不是“六指儿抓痒,多一道子”?所以呀,这个迭代器模式也有点没落了,基本上很少有项目再独立写迭代器了,直接使用 List 或者 Map 就可以完整的解决问题。
package com.iot.practice.designpattern.iterator.iteratorpattern;
import java.util.Iterator;
/**
* IProjectIterator 此接口用于:
* @author:hujm
* @date:2021年02月23日 15:26
* @remark:
* 大家可能很奇怪,你定义的这个接口方法、变量都没有,有什么意义呢?有意义,所有的 Java 书上都一直
* 说是面向接口编程,你的接口是对一个事物的描述,也就是说我通过接口就知道这个事物有哪些方法,哪些属性,
* 我们这里的 IProjectIterator 是要建立一个指向 Project 类的迭代器,目前暂时定义的就是一个通用的迭
* 代器,可能以后会增加 IProjectIterator 的一些属性或者方法。当然了,你也可以在实现类上实现两个接口,
* 一个是 Iterator,一个是 IProjectIterator(这时候,这个接口就不用继承 Iterator),杀猪杀尾巴,
* 各有各的杀发。
*
*/
public interface IProjectIterator extends Iterator {
}
package com.iot.practice.designpattern.iterator.iteratorpattern;
/**
* IProject 此接口用于:
* @author:hujm
* @date:2021年02月23日 15:15
* @remark:
*/
public interface IProject {
/**
* 增加项目
*
* @param name 项目名称
* @param num 项目成员数量
* @param cost 项目费用
*/
public void add(String name,int num,int cost);
/**
* 从老板这里看到的就是项目信息
*
* @return 项目信息
*/
public String getProjectInfo();
/**
* 获得一个可以被遍历的对象
*
* @return 一个可以被遍历的对象
*/
public IProjectIterator iterator();
}
package com.iot.practice.designpattern.iterator.iteratorpattern;
import java.util.ArrayList;
/**
* Project 此类用于:
* @author:hujm
* @date:2021年02月23日 15:17
* @remark:
*/
public class Project implements IProject{
/**
* 定义一个项目列表,说有的项目都放在这里
*/
private ArrayList projectList = new ArrayList();
/**
* 项目名称
*/
private String name = "";
/**
* 项目成员数量
*/
private int num = 0;
/**
* 项目费用
*/
private int cost = 0;
public Project(){}
private Project(String name, int num, int cost) {
// 赋值到类的成员变量中
this.name = name;
this.num = num;
this.cost = cost;
}
@Override
public void add(String name, int num, int cost) {
this.projectList.add(new Project(name, num, cost));
}
@Override
public String getProjectInfo() {
String info = "";
//获得项目的名称
info = info+ "项目名称是:" + this.name;
//获得项目人数
info = info + "\t项目人数: "+ this.num;
//项目费用
info = info+ "\t 项目费用:"+ this.cost;
return info;
}
@Override
public IProjectIterator iterator() {
return new ProjectIterator(this.projectList);
}
}
package com.iot.practice.designpattern.iterator.iteratorpattern;
import java.util.ArrayList;
/**
* ProjectIterator 此类用于:
* @author:hujm
* @date:2021年02月23日 15:27
* @remark:定义一个迭代器
*/
public class ProjectIterator implements IProjectIterator {
/**
* 所有的项目都放在这里ArrayList中
*/
private ArrayList projectList = new ArrayList();
private int currentItem = 0;
/**
* 构造函数传入projectList
*
* @param projectList 所有项目集合
*/
public ProjectIterator(ArrayList projectList) {
this.projectList = projectList;
}
/**
* 判断是否还有元素,必须实现
*
* @return 是否为true
*/
@Override
public boolean hasNext() {
// 定义一个返回值
boolean b = true;
if (this.currentItem >= projectList.size() || this.projectList.get(this.currentItem) == null) {
b = false;
}
return b;
}
/**
* 取得下一个值,必须实现
*
* @return 下一个值
*/
@Override
public IProject next() {
return this.projectList.get(this.currentItem++);
}
}
完结!