美文网首页设计模式
设计模式之禅- 迭代器模式

设计模式之禅- 迭代器模式

作者: 凉快先生 | 来源:发表于2020-12-28 10:53 被阅读0次

    1.业务背景

    老大想分析一下现在还在开发或维护的103个项目,总结们每个项目的支出费用都很高,项目情况复杂,人员情况也不简单的原因。

    2.定义一个接口,所有的项目都是一个接口

    public interface IProject {

        //从老板这里看到的就是项目信息

        public String getProjectInfo();

    }

    所有项目的信息类

    public class Project implements IProject {

        //项目名称

        private String name = "";

        //项目成员数量

        private int num = 0;

        //项目费用

        private int cost = 0;

        //定义一个构造函数,把所有老板需要看到的信息存储起来

        public Project(String name,int num,int cost){

            //赋值到类的成员变量中

            this.name = name;

            this.num = num;

            this.cost=cost;

        }

        //得到项目的信息

        public String getProjectInfo() {

            String info = "";

            //获得项目的名称

            info = info+ "项目名称是:" + this.name;

            //获得项目人数

            info = info + "\t项目人数: "+ this.num;

            //项目费用

            info = info+ "\t 项目费用:"+ this.cost;

            return info;

        }

    }

    3.老板来看项目信息了

    public class Boss {

        public static void main(String[] args) {

            //定义一个List,存放所有的项目对象

            ArrayList<IProject> projectList = new ArrayList<IProject>();

            //增加星球大战项目

            projectList.add(new Project("星球大战项目",10,100000));

            //增加扭转时空项目

            projectList.add(new Project("扭转时空项目",100,10000000));

            //增加超人改造项目

            projectList.add(new Project("超人改造项目",10000,1000000000));

            //这边100个项目

            for(int i=4;i<104;i++){

                projectList.add(new Project("第"+i+"个项目",i*5,i*1000000));

            }

            //遍历一下ArrayList,把所有的数据都取出

            for(IProject project:projectList){

                System.out.println(project.getProjectInfo());

            }

    }

    }

    4.使用迭代器方式遍历

    定义一个接口,所有的项目都是一个接口

    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 { 

    }

    定义一个迭代器

    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() {

            //暂时没有使用到

        }

    }

    老板来看项目信息了

    public class Boss {

        public static void main(String[] args) {

            //定义一个List,存放所有的项目对象

            IProject project = new Project();

            //增加星球大战项目

            project.add("星球大战项目ddddd",10,100000);

            //增加扭转时空项目

            project.add("扭转时空项目",100,10000000);

            //增加超人改造项目

            project.add("超人改造项目",10000,1000000000);

            //这边100个项目

            for(int i=4;i<104;i++){

                project.add("第"+i+"个项目",i*5,i*1000000);

            }

            //遍历一下ArrayList,把所有的数据都取出

            IProjectIterator projectIterator = project.iterator();

                while(projectIterator.hasNext()){

                IProject p = (IProject)projectIterator.next();

                System.out.println(p.getProjectInfo());

            }

        }

    }

    5.迭代器的通用类图

    相关文章

      网友评论

        本文标题:设计模式之禅- 迭代器模式

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