迭代器模式(落没的设计模式)
定义
它提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。
迭代器是为容器服务的,能容纳元素的对象可以称为容器,例:List、Set、Map
迭代器模式(Iterator Pattern)已经是没落的设计模式,常用的容器基本都有成熟稳定的实现,基本不会再去单独写一个迭代器。
实验小结
- 即一个实例对象中封装了一个集合,该类通过实现接口中的iterator方法获得一个迭代器对象,通过迭代器对象对实例中的集合进行遍历。
- 本质就是自己实现一个迭代器,但是目前集合的API中基本都实现了迭代器,并且结合1.8 Stream的特性,完全没有必要自己写迭代器了
代码模拟场景
老板想要查看往期项目的汇总报表,构建一个迭代器装载“项目”对象,再进行迭代展示。
迭代器模式
UML图
项目业务接口及实现类
/*** 项目信息接口*/
public interface IProject {// 老板要阅览的项目信息public String getProjectInfo();// 添加两个方法// 增加项目public void add(String name,int num,int cost);// 获得一个可以被遍历的对象public IProjectIterator iterator();
}public class Project implements IProject {// 定义一个项目列表,所有的项目都放这里private List<IProject> projectList = new ArrayList<>();// 项目名称private String name;// 项目成员数量private int num;// 项目费用private int cost;public Project() {}public Project(String name, int num, int cost) {this.name = name;this.num = num;this.cost = cost;}@Overridepublic String getProjectInfo() {String info = "";// 获得项目的名称info = info + "项目的名称是:" + this.name;// 获得项目人数info = info + "\t项目人数" + this.num;// 项目费用info = info + "\t项目费用" + this.cost;return info;}// 增加项目@Overridepublic void add(String name, int num, int cost) {this.projectList.add(new Project(name, num, cost));}// 获得迭代器对象@Overridepublic IProjectIterator iterator() {return new ProjectIterator(this.projectList);}
}
迭代器接口及实现类
/*** 迭代器接口*/
public interface IProjectIterator extends Iterator<IProject> {
}public class ProjectIterator implements IProjectIterator {// 所有的项目都在List中private List<IProject> projectList = new ArrayList<>();private int currentItem = 0;public ProjectIterator(List<IProject> projectList) {this.projectList = projectList;}@Overridepublic boolean hasNext() {boolean b = true;if (this.currentItem >= projectList.size() || this.projectList.get(this.currentItem) == null) b = false;return b;}@Overridepublic IProject next() {return this.projectList.get(this.currentItem++);}
}
入口类
/*** 迭代器模式*/
public class IteratorMain {public static void main(String[] args) {IProject project = new Project();project.add("星球大战项目", 10, 100000);project.add("扭曲时空项目", 100, 10000000);project.add("超人改造项目", 10000, 1000000000);for (int i = 4; i < 104; i++) {project.add("第" + i + "个项目", i * 5, i * 1000000);}// 迭代器模式IProjectIterator projectIterator = project.iterator();while (projectIterator.hasNext()) {IProject p = projectIterator.next();System.out.println(p.getProjectInfo());}}
}
结果
参考书籍
秦小波《设计模式之禅》