androidAndroid技术知识互联网科技

Android 架构师10 设计模式之迭代器模式

2018-05-02  本文已影响95人  zhang_pan

前言

迭代器模式就是提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示。

迭代器模式

需求

公司领导让我将公司的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

上一篇下一篇

猜你喜欢

热点阅读