前言
迭代器模式迭代器模式就是提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示。
需求
公司领导让我将公司的100个项目名称、花费、人数汇总一下,他要整理一下做成报表,于是我开始着手处理这件事情......
基本实现
IProject接口,面向接口编程嘛,你懂得
public interface IProject {
String getProjectInfo();
}
Project项目类:
private final String name;
private final int num;
private final int cost;
Project(String name, int num, int cost) {
this.name = name;
this.num = num;
this.cost = cost;
}
@Override
public String getProjectInfo() {
return "项目名称是:" + this.name
+ ",项目人数:" + this.num
+ ",项目费用:" + this.cost;
}
}
客户端Client调用:
public class Client {
public static void main(String[] args) {
List<IProject> projects = new ArrayList<>();
projects.add(new Project("英雄联盟项目", 100, 1000));
projects.add(new Project("王者荣耀项目", 110, 10000));
projects.add(new Project("绝地求生项目", 120, 100000));
for(int i = 4; i < 100; i++) {
projects.add(new Project("第" + i + "个项目", 100, 1000));
}
for (int i = 0; i < projects.size(); i++) {
System.out.println(projects.get(i).getProjectInfo());
}
}
}
运行,输出部分截图为:
1.png
迭代器模式
上面有遍历的方法是可以完成任务的,既然遍历可以完成任务,那么迭代自然也是可以完成任务的,那么接下来就让我们看看迭代器模式是怎么工作的。
面向接口编程,接口IProject:
public interface IProject {
void add(String name, int num, int cost);
String getProjectInfo();
IProjectIterator iterator();
}
项目类Project:
public class Project implements IProject {
List<IProject> projects = new ArrayList<>();
private String name = "";
private int num = 0;
private int cost = 0;
Project() {
}
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.projects.add(new Project(name, num, cost));
}
@Override
public String getProjectInfo() {
return "项目名称是:" + this.name
+ ",项目人数:" + this.num
+ ",项目费用:" + this.cost;
}
@Override
public IProjectIterator iterator() {
return new ProjectIterator(projects);
}
}
IProjectIterator接口:
public interface IProjectIterator extends Iterator {
}
有人要说了,你这个接口,啥东东都没啊,干嘛还写呢?其实这个类是为了扩展的,也是面向接口编程的,当然如果你真的不去写,也没多大关系。
ProjectIterator迭代器:
public class ProjectIterator implements IProjectIterator {
private List<IProject> projects = new ArrayList<>();
private int currentItem = 0;
ProjectIterator(List<IProject> projectList) {
this.projects = projectList;
}
@Override
public boolean hasNext() {
boolean b = true;
if (currentItem >= projects.size() || projects.get(currentItem) == null) {
b = false;
}
return b;
}
@Override
public IProject next() {
return projects.get(currentItem++);
}
}
客户端调用Client:
public class Client {
public static void main(String[] args) {
Project project = new Project();
project.add("英雄联盟项目", 100, 1000);
project.add("王者荣耀项目", 110, 10000);
project.add("绝地求生项目", 120, 100000);
for(int i = 4; i < 100; i++) {
project.add("第" + i + "个项目", 100, 1000);
}
IProjectIterator iterator = project.iterator();
while (iterator.hasNext()) {
IProject p = (IProject) iterator.next();
System.out.println(p.getProjectInfo());
}
}
}
运行,输出为:
2.png总结
对于迭代器模式来说,其自身优点很明显也很单一,支持以不同的方式去遍历一个容器对象,也可以有多个遍历,弱化了容器类与遍历算法之间的关系,而其缺点就是对类文件的增加。
大家也可能会想到其他的语言,如C++、Python、PHP等,它们内部也有众多容器体的定义,当然,也有相应的迭代器。迭代器模式发展至今,几乎每一种高级语言都有相应的内置实现,对于开发者而言,已经极少会去由自己来实现迭代器了,因此,对于迭代器模式更多地是在于了解而非应用。
喜欢本篇博客的简友们,就请来一波点赞,您的每一次关注,将成为我前进的动力,谢谢!作者:zhang_pan
网友评论