美文网首页androidAndroid技术知识互联网科技
Android 架构师10 设计模式之迭代器模式

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

作者: zhang_pan | 来源:发表于2018-05-02 23:59 被阅读95次

    前言

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

    迭代器模式

    需求

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

    相关文章

      网友评论

      本文标题:Android 架构师10 设计模式之迭代器模式

      本文链接:https://www.haomeiwen.com/subject/puwcrftx.html