您的位置:首页 > 编程语言 > Java开发

Java设计模式--迭代器模式

2016-07-31 11:23 288 查看
迭代器模式【Iterator Pattern 】

迭代器可以解决一些遍历的问题。那我们以老总查看公司项目信息为例。先看下最初的类图。



上面的类图可以完成老总的需要,下面使用迭代器的方式来进行。看下类图:



IProject 可以定义如下:

public interface IProject {
//增加项目
public void add(String name,int num,int cost);
//从老板这里看到的就是项目信息
public String getProjectInfo();
//获得一个可以被遍历的对象
public IProjectIterator iterator();
}


定义一个实现类:

public class Project implements IProject {
//定义一个项目列表,说有的项目都放在这里
private ArrayList<IProject> projectList = new ArrayList<IProject>();
//项目名称
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;
}
//增加项目
public void add(String name,int num,int cost){
this.projectList.add(new Project(name,num,cost));
}
//得到项目的信息
public String getProjectInfo() {
String info = "";
//获得项目的名称
info = info+ "项目名称是:" + this.name;
//获得项目人数
info = info + "\t项目人数: "+ this.num;
//项目费用
info = info+ "\t 项目费用:"+ this.cost;
return info;
}
//产生一个遍历对象
public IProjectIterator iterator(){
return new ProjectIterator(this.projectList);
}
}


看迭代器接口:

public interface IProjectIterator extends Iterator {
}


什么方法都木有,要实现一个容器或者其他 API 提供接口时,一般先写一个接口继承, 然后再继承自己写的接口, 保证自己的实现类只用实现自己写的接口 。

该接口的实现:

public class ProjectIterator implements IProjectIterator {
//所有的项目都放在这里ArrayList中
private ArrayList<IProject> projectList = new ArrayList<IProject>();
private int currentItem = 0;
//构造函数传入projectList
public ProjectIterator(ArrayList<IProject> projectList){
this.projectList = projectList;
}
//判断是否还有元素,必须实现
public boolean hasNext() {
//定义一个返回值
boolean b = true;
if(this.currentItem>=projectList.size() ||
this.projectList.get(this.currentItem) == null){
b =false;
}
return b;
}
//取得下一个值
public IProject next() {
return (IProject)this.projectList.get(this.currentItem++);
}
//删除一个对象
public void remove() {
//暂时没有使用到
}
}


在主类进行调用时

//定义一个List,存放所有的项目对象
IProject project = new Project();
project.add(,,,);
//遍历一下ArrayList,把所有的数据都取出
IProjectIterator projectIterator = project.iterator();
while(projectIterator.hasNext()){
IProject p = (IProject)projectIterator.next();
System.out.println(p.getProjectInfo());
}


从面向对象的开发上来看,project.add()增加一个项目显得更加的友好。

最后看下,通用类图:



其实这样看起来迭代器显得有些复杂了,但是在项目中基本无需我们自己去定义迭代器了,看下面就知道了。



从上图可以看出很多的子类继承了Iterable这个接口,我们直接使用 List 或者 Map 就已经可以完整的解决问题了。

总结:

迭代器模式主要是解决一下遍历的问题,但是由于随着JDK版本的升级,Iterator已经应用到各个聚集类(Collection)中了,所以一般使用迭代器模式只需使用JDK已经实现的方法即可啦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java设计模式 java