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

迭代器模式【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已经实现的方法即可啦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章